我的代码在acwing上提交,通过数据也是acwing显示的。
数据与官方数据不一定相同。
#include#include #include using namespace std; int main() { int num; num=2*9*9*9+0*9*9+2*9+2; printf("%dn",num); }
试题 B: 顺子日期
#include#include #include using namespace std; int sum=0; void dfs(int x,int y) { int a[10]; a[1]=2;a[2]=0;a[3]=2;a[4]=2; a[5]=x/10;a[6]=x%10; a[7]=y/10;a[8]=y%10; for(int i=1;i<=6;i++) { // if(a[i]==a[i+1]+1&&a[i]==a[i+2]+2)// printf("2020%02d%02d %d %d %d %dn",x,y,i,a[i],a[i+1],a[i+2]); // { // for(int j=1;j<=8;j++) // printf("%d ",a[j]);sum++; // printf(" %dn",sum); // // } if(a[i]==a[i+1]-1&&a[i]==a[i+2]-2)// printf("2020%02d%02dn",x,y); { for(int j=1;j<=8;j++) printf("%d ",a[j]);sum++; printf(" %dn",sum); break; } } } int main() { int i,j,n,m; for(i=1;i<=12;i++) { for(j=1;j<=31;j++) { if(i==2&&j>28) break; if((i==4||i==6||i==9||i==11)&&j>30) break; dfs(i,j); } } printf("%dn",sum); }
试题 C: 刷题统计
#include#include #include using namespace std; int main() { long long i,j,n,m,m1; long long a,b,n1; scanf("%lld %lld %lld",&a,&b,&n); m=5*a+2*b; m1=n/m; n=n%m; if(n==0) printf("%lldn",m1*7); else { for(i=1;i<=7;i++) { if(i<=5) n=n-a; else n=n-b; if(n<=0) break; } printf("%lldn",m1*7+i); } return 0; }
试题 D: 修剪灌木
#include#include #include using namespace std; const int N=10010; int a[N],b[N],book[N]; int main() { int i,j,n,m,t; scanf("%d",&n); for(i=1,t=1;i<=n;i++,t++) { a[i]=max(a[i],t-book[i]); book[i]=t; } for(i=n-1,t=t;i>=1;i--,t++) { a[i]=max(a[i],t-book[i]); book[i]=t; } for(i=2,t=t;i<=n;i++,t++) { a[i]=max(a[i],t-book[i]); book[i]=t; } for(i=1;i<=n;i++) printf("%dn",a[i]); return 0; }
试题 E: X 进制减法
#include#include #include using namespace std; const int N=1010; long long a[N],b[N],c[N]; int main() { int i,j,k,la,lb; scanf("%d",&k); scanf("%d",&la); for(i=la;i>=1;i--) scanf("%lld",&a[i]); scanf("%d",&lb); for(i=lb;i>=1;i--) scanf("%lld",&b[i]); c[0]=1; for(i=1;i<=la||i<=lb;i++) { if(a[i]==0&&b[i]!=0) c[i]=b[i]+1; else if(a[i]!=0&&b[i]==0) c[i]=a[i]+1; else if(a[i]==0&&b[i]==0) c[i]=2; else c[i]=max(a[i]+1,b[i]+1); } for(i=1;i<=la||i<=lb;i++) { if(a[i]=1;i--) { sum=a[i]+sum*c[i]; sum=sum%1000000007; // printf("%lld %lld %lldn",a[i],sum,c[i]); } printf("%lldn",sum); return 0; }
试题 F: 统计子矩阵
写的不太对,数据没有全通过,通过90%。
#include#include #include using namespace std; using namespace std; typedef long long LL; const int N=510; LL a[N][N],b[N][N],cnt,n,m,k; inline LL calc(int x1,int y1,int x2,int y2) { return b[x2][y2]-b[x2][y1-1]-b[x1-1][y2]+b[x1-1][y1-1]; } int main() { scanf("%lld%lld%lld",&n,&m,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%lld",&a[i][j]); b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j]; } } for(int l=1;l<=m;l++)//枚举矩阵的左边 { for(int r=l;r<=m;r++)//枚举矩阵的右边 { for(int i=1,j=1;i<=n;i++)//有了左右边界,从上到下双指针扫描 { while(j<=i&&calc(j,l,i,r)>k) j++; if(j<=i) cnt+=(i-j+1);//有可能最小的矩阵都不满足,此时j>i } } } printf("%lld",cnt); return 0; }
试题 G: 积木画
不会
试题 H: 扫雷
时间超限,通过50%。
#include#include #include using namespace std; const int N=50010; struct no { int x; int y; int r; }a[N]; int book[N],b[N][9000]; void dfs(int x) { int i,j; book[x]=1; for(i=1;i<=b[x][0];i++) { // printf("*****%dn",b[x][i]); if(book[b[x][i]]) continue; dfs(b[x][i]); } } int main() { int i,j,n,m; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].r); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) continue; if((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)<=(a[i].r*a[i].r)) { b[i][0]++; b[i][b[i][0]]=j; } } } // for(i=1;i<=n;i++) // { // printf("****%d ",b[i][0]); // for(j=1;j<=b[i][0];j++) // printf("%d ",b[i][j]); // printf("n"); // } for(i=1;i<=m;i++) { int x,y,r; scanf("%d %d %d",&x,&y,&r); for(j=1;j<=n;j++) { if(book[j]) continue; // printf("*****%d %dn",(a[j].x-x)*(a[j].x-x)+(a[j].y-y)*(a[j].y-y),r*r); if((a[j].x-x)*(a[j].x-x)+(a[j].y-y)*(a[j].y-y)<=(r*r)) { dfs(j); } } } int sum=0; for(i=1;i<=n;i++) if(book[i]) sum++; printf("%dn",sum); return 0; }
试题 I: 李白打酒加强版
数据太大,只通过10%。
#include#include #include using namespace std; int n,m,sum,num; int a[210]; void dfs(int step) { if(step==n+m) { int n1,m1; n1=m1=0; for(int i=1;i<=n+m;i++) { if(a[i]) n1++; else m1++; } if(n1==n&&m1==m) { long long num=2; for(int i=1;i<=n+m;i++) { if(a[i]) num=num*2; else num--; } if(num==0) sum++; } return; } a[step]=1,dfs(step+1); a[step]=0,dfs(step+1); } int main() { int i,j; scanf("%d %d",&n,&m);//n店,m花 a[1]=1,dfs(2);//n,店 a[1]=0,dfs(2);//m,花 printf("%dn",sum); return 0; }
试题 J: 砍竹子
不会
总结
这次最大的问题就是数据范围没有看准,有的数据范围是105但是我只开了103。
以后绝对不可以出现这样的重大事故。
最终结果还可以省一。



