A.游戏
链接:https://www.nowcoder.com/acm/contest/210/A
来源:牛客网
题目有多组数据
第一行一个整数t,表示数据组数
对于每组数据,第一行两个整数n,m,接下来n行每行m个字符
输出共t行,每行一个字符串表示答案
对于
的数据,
对于另
的数据,
对于
的数据
/* 题目描述写的很清楚,三个人的操作都是为了 BLUESKY007能赢,所以游戏一定会结束,那么当横纵坐标最大的非 B 颜色方格变为 B 颜 色时,可操作的方格范围显然是趋向收敛的,又因为操作规则的要求,左上角的方格在每 次操作中都会按规则进行变换,当可操作范围收敛到左上角且左上角变为 B 颜色时,游 戏结束,所以无论中间的操作是怎样进行的,最终左上角的方格一定会变为 B 颜色,而且 进行操作的人数和操作变换长度相同,所以只需要判断左上角方格的颜色即可 */ #include<bits/stdc++.h> using namespace std; char maze[1000+5][1000+5]; int main() { int t; cin>>t; int n,m; while(t--) { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) { cin>>maze[i]; } if(maze[0][0]==‘R‘) puts("dreagonm"); else if(maze[0][0]==‘G‘) puts("fengxunling"); else puts("BLUESKY007"); } }
B.水果蛋糕
链接:https://www.nowcoder.com/acm/contest/210/B
一行两个正整数n,m
一行一个整数表示答案
对于20%的数据,min(n,m)≤3,n,m≤103
9
对于100%的数据,n,m≤ 10
/* 规律题 */ #include<bits/stdc++.h> using namespace std; int n,m; int main() { scanf("%d%d",&n,&m); if(n<3||m<3){printf("%lld\n",1ll*n*m);return 0;} if(n>m)swap(n,m); if(n==4&&m==4){puts("12");return 0;} if(n==4&&m==5){puts("17");return 0;} if(n==4) { int t=m/6,r=m%6; long long ans=2ll*m; if(r==1||r==2)ans+=2*r; else if(r==3||r==4)ans+=4; else if(r==5)ans=12ll*(t+1); printf("%lld\n",ans); return 0; } if(n==3) { int t=m/6,r=min(3,m%6); long long ans=m+6ll*t+2ll*r; printf("%lld\n",ans); return 0; } cout<<(1ll*n*m+1)/2<<endl; return 0; }
C.好朋友
链接:https://www.nowcoder.com/acm/contest/210/C
来源:牛客网
第一行一个整数t,表示询问个数i
接下来t行,每行两个整数l
,ri
一行一个整数表示答案
#include<bits/stdc++.h> #define N 500000 using namespace std; int n,m,l,r,ans; int sum[N]; int main() { int T;cin>>T; sum[1007]=1; sum[2007]=1; sum[3007]=1; sum[4007]=1; sum[5007]=1; sum[6007]=1; sum[7007]=1; sum[8007]=1; sum[9007]=1; sum[10007]=1; sum[20007]=1; sum[30007]=1; sum[40007]=1; sum[11007]=1; sum[12007]=1; sum[13007]=1; sum[14007]=1; sum[15007]=1; sum[16007]=1; sum[17007]=1; sum[18007]=1; sum[19007]=1; sum[10107]=1; sum[10207]=1; sum[10307]=1; sum[10407]=1; sum[10507]=1; sum[10607]=1; sum[10707]=1; sum[10807]=1; sum[10907]=1; sum[10017]=1; sum[10027]=1; sum[10037]=1; sum[10047]=1; sum[10057]=1; sum[10067]=1; sum[10077]=1; sum[10087]=1; sum[10097]=1; sum[11007]=1; sum[12007]=1; sum[13007]=1; sum[14007]=1; sum[15007]=1; sum[16007]=1; sum[17007]=1; sum[18007]=1; sum[19007]=1; sum[10107]=1; sum[10207]=1; sum[10307]=1; sum[10407]=1; sum[10507]=1; sum[10607]=1; sum[10707]=1; sum[10807]=1; sum[10907]=1; sum[10017]=1; sum[10027]=1; sum[10037]=1; sum[10047]=1; sum[10057]=1; sum[10067]=1; sum[10077]=1; sum[10087]=1; sum[10097]=1; sum[10070]=1; sum[10071]=1; sum[10072]=1; sum[10073]=1; sum[10074]=1; sum[10075]=1; sum[10076]=1; sum[10077]=1; sum[10078]=1; sum[10079]=1; sum[21007]=1; sum[22007]=1; sum[23007]=1; sum[24007]=1; sum[25007]=1; sum[26007]=1; sum[27007]=1; sum[28007]=1; sum[29007]=1; sum[20107]=1; sum[20207]=1; sum[20307]=1; sum[20407]=1; sum[20507]=1; sum[20607]=1; sum[20707]=1; sum[20807]=1; sum[20907]=1; sum[20017]=1; sum[20027]=1; sum[20037]=1; sum[20047]=1; sum[20057]=1; sum[20067]=1; sum[20077]=1; sum[20087]=1; sum[20097]=1; sum[20070]=1; sum[20071]=1; sum[20072]=1; sum[20073]=1; sum[20074]=1; sum[20075]=1; sum[20076]=1; sum[20077]=1; sum[20078]=1; sum[20079]=1; sum[31007]=1; sum[32007]=1; sum[33007]=1; sum[34007]=1; sum[35007]=1; sum[36007]=1; sum[37007]=1; sum[38007]=1; sum[39007]=1; sum[30107]=1; sum[30207]=1; sum[30307]=1; sum[30407]=1; sum[30507]=1; sum[30607]=1; sum[30707]=1; sum[30807]=1; sum[30907]=1; sum[30017]=1; sum[30027]=1; sum[30037]=1; sum[30047]=1; sum[30057]=1; sum[30067]=1; sum[30077]=1; sum[30087]=1; sum[30097]=1; sum[30070]=1; sum[30071]=1; sum[30072]=1; sum[30073]=1; sum[30074]=1; sum[30075]=1; sum[30076]=1; sum[30077]=1; sum[30078]=1; sum[30079]=1; sum[41007]=1; sum[42007]=1; sum[43007]=1; sum[44007]=1; sum[45007]=1; sum[46007]=1; sum[47007]=1; sum[48007]=1; sum[49007]=1; sum[40107]=1; sum[40207]=1; sum[40307]=1; sum[40407]=1; sum[40507]=1; sum[40607]=1; sum[40707]=1; sum[40807]=1; sum[40907]=1; sum[40017]=1; sum[40027]=1; sum[40037]=1; sum[40047]=1; sum[40057]=1; sum[40067]=1; sum[40077]=1; sum[40087]=1; sum[40097]=1; sum[40070]=1; sum[40071]=1; sum[40072]=1; sum[40073]=1; sum[40074]=1; sum[40075]=1; sum[40076]=1; sum[40077]=1; sum[40078]=1; sum[40079]=1; for(int i=1007;i<=50000;i++) sum[i]+=sum[i-1]; while(T--) { cin>>l>>r; if(l<=1000 && r<=1000) ans^=0; else if(l<=50000 && r<=50000) ans^=sum[r]-sum[l-1]; } printf("%d\n",ans); return 0; }
/* 因为"好朋友"的定义为含有"007",所以有很多情况都会被视为含有"007",例如 "10707","17007"等,此时我们发现对于含有"007"的情况的讨论比较复杂,所以我们不 妨讨论不含"007"的情况,也即对于任意的含有 7 的数,其中每一个7前都至多有2个0 , 由此可以设f[i][j]表示在前 i 位有 j 个 0 的数的个数,在数位DP过程中存当前位置和已有 的 0 的个数,显然在 0 的个数>=2时,后面的数位上都不可能再有7.在求出不含"007"的 数之后,用总数减掉即可。 */ #include<bits/stdc++.h> #define ll long long using namespace std; ll l,r,ans,f[20][4],d[20]; int t,m,i,j,k,x,a[20]; ll work(ll n) { if(n<1000)return 0; for(m=0;n;n/=10)a[m++]=n%10; reverse(a,a+m); memset(f,0,sizeof(f)); f[1][0]=a[0]-1; x=0; for(i=1;i<m;i++) { f[i+1][0]=f[i][0]*9; f[i+1][1]=f[i][0]+f[i][1]*9; f[i+1][2]=f[i][1]+f[i][2]*9; f[i+1][3]=f[i][2]+f[i][3]*10; f[i+1][x]+=a[i]-1; f[i+1][x+(x<2&&a[i]||x==2&&a[i]>7)]++; if(x<2&&!a[i]||x==2&&a[i]==7)x++; } return d[m-1]+f[m][3]; } int main() { for(i=0,l=1;i<=18;i++,l*=10)d[i]=work(l-1); scanf("%d",&t); while(t--) { scanf("%lld%lld",&l,&r); ans^=work(r+1)-work(l); } cout<<ans<<endl; return 0; }
原文:https://www.cnblogs.com/L-Memory/p/9789166.html