这种大场全是神仙打架,向我这种菜菜就是掉分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也能做,可是我不会,回头看看别的大佬咋写的再补一下吧
要加油哦~