这种大场全是神仙打架,向我这种菜菜就是掉分www太难了
神仙打架,百姓遭殃。
A - Omkar and Password
分析可以知道,只要数组元素不是全部相等答案就是1,如何数组元素全部相等答案就是n。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[N];
int n;
int main()
{IO;int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];bool ok=1;for(int i=2;i<=n;i++) if(a[i]!=a[1]){ok=0;break;}if(ok) cout<<n<<endl;else cout<<1<<endl;}return 0;
}
B - Omkar and Infinity Clock
数学题,稍微写一下就可以找到规律。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
ll n,k;
int main()
{IO;int T;cin>>T;while(T--){cin>>n>>k;ll maxa=-2e9,mina=2e9;for(int i=1;i<=n;i++) {cin>>a[i];maxa=max(maxa,a[i]);mina=min(mina,a[i]);}if(k&1){for(int i=1;i<=n;i++) cout<<maxa-a[i]<<" ";cout<<endl;}else{for(int i=1;i<=n;i++) cout<<a[i]-mina<<" ";cout<<endl;}}return 0;
}
C - Omkar and Waterslide
贪心洛谷原题
题目转化一下相当于添坑。
如果a[i-1]>a[i]
说明需要填完a[i-1]-a[i]
然后转化为添第i-1
个坑即f[i-1]
如果a[i-1]<=a[i]
说明填i-1
个坑的同时能过顺便填上第i
个坑
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
ll n;
ll f[N];
int main()
{IO;int T;cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) f[i]=f[i-1]+max(a[i-1]-a[i],0ll);cout<<f[n]<<endl;}return 0;
}
就做了三个题
D - Omkar and Bed Wars
参考答案正解%%%Orz
首先考虑不合法的情况:
①s[i-1]=L
并且s[i+1]=L
但是s[i]=L
也就是你右边的人打你,你左边的人没打你但是你却打你左边的人。
②s[i-1]=R
并且s[i+1]=R
但是s[i]=R
也就是你左边的人打你,你右边的人没打你但是你却打你右边的人。
发现就这两种不符合规矩的情况即不能有3个连续相同的字符(Orz我当时乱的一p,这分析太妙了)
因此统计连续相同字符的个数cnt
,然后变成不能有3个连续相同的字符。如果连续相同的字符数目是cnt
那么要花费cnt/3
的代价。
注意如果是一个环,首先找一个点花费1代价破环,最终花费即(cnt-1)/3+1
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=200010;
ll a[N];
int n;
int main()
{IO;int T;cin>>T;while(T--){int n;cin>>n;string s;cin>>s;int cnt=0;while(s.size()&&s[0]==s.back()){cnt++;s.pop_back();}if(s.empty()){if(cnt<=2) cout<<0<<endl;else if(cnt==3) cout<<1<<endl;else cout<<(cnt-1)/3+1<<endl;}else{int res=0;s.push_back('$');for(int i=0;i<s.size()-1;i++){cnt++;if(s[i]!=s[i+1]){res+=cnt/3;cnt=0;}}cout<<res<<endl;}}return 0;
}
这题好像dp也能做,可是我不会,回头看看别的大佬咋写的再补一下吧
要加油哦~