Codeforces Round #376 (Div. 2)
T1:
题意:给你一个环,从‘a'-->'b'--->'c'--->....--->'z'---'a'
然后开始于’a',给你一串字符,求从‘a'开始一直依次走字符要走多少步
题解:模拟
T2:
题意:给你n个数字,你可以给这个数字-2(无数个)或者自己-1,自己后面一个数-1,问是否能全部为0;
题解:模拟
T3:
题意:给你一些袜子,每个袜子有自己的颜色,然后给你很多对(x-y)希望将(x-y)染成同一种颜色,求最小染色步数
题解:并查集+线段树
T4:
题意:给你一些字符串,然后给你一种移动规则:移动一步,每个字符%m+1; 求最小移动步数使得字符串大小按字典序排序
题解:将一些不和法区间弄出来用线段树或者差分维护即可
T5:
题意:两个人轮流按某个规则取数(从左向右取数字可以取【2--n】个,获得权值为数字和,同时取完后在最左边加一个权值为数字和的数
希望先手-后手的差最大[两个人绝顶聪明]
题解:设一个dp[i]表示从i--n中开始先手先取的最大差值
dp[i]=max(sum[j]-dp[j]) i+1<=j<=n
于是考虑从后往前做可将时间优化为O[n]的
T6
题意:给你一些数字,你可以选择其中一个不动的数字X,其他数字可以删减使得所有数为X的倍数,求所有数字之和的最大值!
题解:考虑一个数一定在X*(j-1)和X*(j)之中,因为不能+所以一定会变为X*(j-1)所以我只需要知道X*(J-1)--X*j中有多少个数字存在原数列中
时间复杂度为n*log(maxn) 可能重复出现某个数字,于是我们用vis记录一下即可!
代码集合:
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cstdio> using namespace std; char s[105]; int n; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); return x*f; } int main() { scanf("%s",s+1); n=strlen(s+1); char p='a'; int ans=0; for (int i=1; i<=n; i++) { ans+=min(abs(s[i]-p),26-abs(p-s[i])); p=s[i]; } cout<<ans<<endl; return 0; }
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cstdio> using namespace std; int n; int a[200005]; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); return x*f; } int main() { n=read(); bool bo=true; for (int i=1; i<=n; i++) { a[i]=read()-a[i-1]; if (a[i]<0) {bo=false; break;} a[i]=(a[i]-a[i]/2*2); if (a[i]==0) continue; if (i==n) {bo=false;} } if (bo) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }