Codeforces Round #553 (Div. 2) (A,B,C,D)

分手后的思念是犯贱 2022-02-16 15:53 303阅读 0赞

终测一个题A,B被hack了。好好补题啦

题目链接:https://codeforces.com/contest/1151

A. Maxim and Biology (模拟,不解释)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=110;
  5. int main(){
  6. int n;
  7. scanf("%d",&n);
  8. string s="ACTG",t;
  9. cin>>t;
  10. int res=150,sum;
  11. for(int i=3;i<n;i++){
  12. sum=0;
  13. for(int k=0;k<4;k++){
  14. int c=abs(t[i-3+k]-s[k]);
  15. //printf("c=%d\n",c);
  16. c=min(c,26-c);
  17. //printf("*c=%d\n",c);
  18. sum+=c;
  19. }
  20. res=min(res,sum);
  21. }
  22. printf("%d\n",res);
  23. }

B - Dima and a Bad XOR (模拟)

思路:异或和不为0就行,一开始选每一行的第一个数,看看它们的异或结果是不是>0;否则,看能不能换个数,换个之前没有加入过的值,由异或的性质得,异或结果肯定不为0。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=510;
  5. int mp[maxn][maxn],vis[maxn];
  6. int n,m;
  7. int main(){
  8. scanf("%d%d",&n,&m);
  9. int res=0;
  10. for(int i=1;i<=n;i++){
  11. for(int j=1;j<=m;j++){
  12. scanf("%d",&mp[i][j]);
  13. }
  14. res^=mp[i][1];
  15. vis[i]=1;
  16. }
  17. bool flag=false;
  18. if(res==0){
  19. for(int i=1;i<=n;i++){
  20. for(int j=2;j<=m;j++){
  21. if(mp[i][j]!=mp[i][1]){
  22. vis[i]=j;
  23. flag=true;
  24. break;
  25. }
  26. }
  27. if(flag) break;
  28. }
  29. }else flag=true;
  30. if(flag){
  31. printf("TAK\n");
  32. for(int i=1;i<=n;i++){
  33. if(i==1) printf("%d",vis[i]);
  34. else printf(" %d",vis[i]);
  35. }
  36. printf("\n");
  37. }else{
  38. printf("NIE\n");
  39. }
  40. }

C - Problem for Nazar

分析:给你一个数的位置pos你可以算出[1,pos]区间内奇数和偶数的个数,而奇数是以1为首项,2为等差数列(odd*odd),偶数以1为首项,2为等差数列(even*even+even),由此求出前缀和。剩下的就好求了,sum[r]-sum[l-1]。ps.记得取模。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=510;
  5. const int MOD=1e9+7;
  6. ll solve(ll id){
  7. ll ans=0,L=1,odd=0,even=0,tmp;
  8. int flag=1;
  9. while(id>0){
  10. tmp=min(L,id);
  11. if(flag) odd+=tmp;
  12. else even+=tmp;
  13. id-=tmp;
  14. L*=2;
  15. flag^=1;
  16. }
  17. odd%=MOD;
  18. even%=MOD;
  19. //cout<<"sumodd="<<(odd*odd)%MOD<<endl;
  20. //cout<<"sumeven="<<(even*even)%MOD<<endl;
  21. ans=((odd*odd)%MOD+((even*even)%MOD+even)%MOD)%MOD;
  22. //cout<<"ans="<<ans<<endl;
  23. return ans;
  24. }
  25. int main(){
  26. ll l,r;
  27. scanf("%lld%lld",&l,&r);
  28. ll a=solve(r),b=solve(l-1);
  29. //cout<<"a="<<a<<",b="<<b<<",a-b="<<(a-b+MOD)%MOD<<endl;
  30. printf("%lld\n",(a-b+MOD)%MOD); //因为a,b为取模后的结果,大小关系不确定,所以加上MOD保证结果为正
  31. return 0;
  32. }

D - Stas and the Queue at the Buffet

分析:a⋅(j−1)+b⋅(n−j) ,即(a-b)*j-a+n*b从该式可以得出(a-b)越大的应该尽可能往左边坐,这样不满值才能更小。ps.我怎么记得比赛的时候就分析出这题了呢?!怎么没写

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=1e5+10;
  5. const int MOD=1e9+7;
  6. struct Node{
  7. ll a,b;
  8. ll dif;
  9. bool operator <(const Node &A)const{
  10. return dif>A.dif;
  11. }
  12. }mes[maxn];
  13. int main(){
  14. int n;
  15. scanf("%d",&n);
  16. for(int i=1;i<=n;i++){
  17. scanf("%lld%lld",&mes[i].a,&mes[i].b);
  18. mes[i].dif=mes[i].a-mes[i].b;
  19. }
  20. sort(mes+1,mes+1+n);
  21. ll ans=0;
  22. for(int i=1;i<=n;i++){
  23. //ans+=mes[i].dif*i-mes[i].a+n*mes[i].b;
  24. ans+=(i-1)*mes[i].a+(n-i)*mes[i].b;
  25. }
  26. printf("%lld\n",ans);
  27. return 0;
  28. }

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读