Run time: 预处理数据,a[i]代表听完前i首歌跑的总步数,听了 l-r 歌后跑的步数是:a[r]-a[l-1]。这样就不超时了,复杂度降到O(1);
#include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; const int N=10000+100; ll a[N]; int main() { int t; scanf("%d",&t); while(t--) { int n,q,k=1; scanf("%d%d",&n,&q); while(n--) { char str[100+10]; scanf("%s",str); int len=strlen(str); int s=0; for(int i=0;i<len;i++) s+=str[i]-'A'+65; a[k++]=s; } for(int i=1;i<k;i++) a[i]+=a[i-1]; while(q--) { int l,r; scanf("%d%d",&l,&r); printf("%lld\n",a[r]-a[l-1]); } } return 0; } 写不出来抄十遍: 知道如何简便输入数据就简单了,如果用的%s格式读入数据也可以。 #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; int main() { int t; scanf("%d",&t); while(t--) { char ch; int a,b,c; scanf("%d%c%d=%d",&a,&ch,&b,&c); if(ch=='+') { if(a+b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else if(ch=='-') { if(a-b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else if(ch=='*') { if(a*b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else { if(b&&a/b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } } return 0; } ====================== #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; int main() { int t; scanf("%d",&t); while(t--) { char str[100],ch; scanf("%s",str); int a,b,c,len=strlen(str),p=0; for(int i=0;i<len;i++) if(str[i]=='/'||str[i]=='*'||str[i]=='+'||str[i]=='-') {ch=str[i];p=i;break;} int s=0,flag=0; for(int i=0;i<p;i++) { if(str[0]=='-') {flag=1;continue; } s=s*10+str[i]-'0'; } a=s; if(flag) a=-a; s=0;flag=0; for(int i=p+1;str[i]!='=';i++) { if(str[i]=='-') {flag=1;continue;} s=s*10+str[i]-'0'; p=i; } b=s; if(flag) b=-b; s=0;flag=0; for(int i=p+2;i<len;i++) { if(str[i]=='-') {flag=1;continue;} s=s*10+str[i]-'0'; } c=s; if(flag) c=-c; // printf("%d %d %d\n",a,b,c); if(ch=='+') { if(a+b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else if(ch=='-') { if(a-b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else if(ch=='*') { if(a*b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } else { if(b&&a/b==c) cout<<"Y"<<endl; else cout<<"N"<<endl; } } return 0; } 小学生几何: 点到直线距离 / 面积公式都可以,代码不解释。 #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; const int N=10000+100; double s; void f(int x1,int y1,int x2,int y2,int x3,int y3) { s=0.5*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2); if(s<0) s=-s; } double dis(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main() { int t; scanf("%d",&t); while(t--) { int x1,x2,x3,y1,y2,y3; scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3); f(x1,y1,x2,y2,x3,y3); printf("%.1lf\n",2*(s/dis(x1,y1,x2,y2)+s/dis(x1,y1,x3,y3)+s/dis(x2,y2,x3,y3))); } return 0; } 奇数排队: 桶排序_不要被名词吓到。。水过,, #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; const int N=10000+100; int num[1000]; int main() { int t; scanf("%d",&t); while(t--) { memset(num,0,sizeof(num)); int n; scanf("%d",&n); for(int i=0;i<n;i++) { int x; cin>>x; num[x]++; } int p; for(int i=100;i>=0;i--) if(num[i]%2){p=i;break;} for(int i=0;i<p;i++) if(num[i]%2) cout<<i<<" "; cout<<p<<endl; } return 0; } 小蝌蚪寻亲: 简单的暴力比较下大串中是否出现过小串,就知道有没有蝌蚪的名字啦。 #include<bits/stdc++.h> #include<cstdio> using namespace std; int main() { char a[10000]; int t,flag=0,len1; scanf("%d",&t); scanf("%s",a); len1=strlen(a); while(t--) { char str[1000]; scanf("%s",str); int len=strlen(str); int j=0; for(int i=0;i<len;i++) { if(str[i]==a[j]) {j++;if(j==len1){flag=1;break;}continue;} else {j=0;} } } if(flag){printf("Y\n");} else printf("N\n"); return 0; } 矩阵列之最大值: 盼到水题了,代码不解释。。 #include<bits/stdc++.h> #include<cstdio> using namespace std; int main() { int a[11][11],n; cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; int maxn=-999999; for(int j=0;j<n;j++) { int s=0; for(int i=0;i<n;i++) s+=a[i][j]; if(s>maxn) maxn=s; } cout<<maxn<<endl; return 0; } 特别的分解: 数学知识,可以考虑一个矩形当长宽相等时面积最大,,试找公约数为1的组合,同时长宽值接近。。 #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; int main() { int t; scanf("%d",&t); while(t--) { ll x; scanf("%lld",&x); if(x%2){printf("%lld\n",(x/2)*(x/2+1));} else { ll c=x/2; if(c%2==0){printf("%lld\n",(c-1)*(c+1));} else {printf("%lld\n",(c-2)*(c+2));} } } return 0; } 滴滴暖被窝: 瑞年do you know,常识是不需要学习的,不是吗?主要考察思维的严谨。代码思路是求出2016.1.1到具体某年需付费的天数。 #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; int a[3]={31,28,31}; int leap(int year){ if(year%4==0&&year0!=0||year@0==0) return 1; return 0; } ll f(int y,int m,int d) { ll sum=0; for(int i=2016;i<=y-1;i++) {sum+=90;if(leap(i))sum+=1;} if(m>1) sum+=31; if(m>2) {sum+=28;if(leap(y))sum+=1;} if(m==1||m==2||m==12) sum+=d; return sum; } int main() { int t; scanf("%d",&t); while(t--) { int y,m,d,y1,m1,d1; scanf("%d%d%d%d%d%d",&y,&m,&d,&y1,&m1,&d1); ll ans=f(y1,m1,d1)-f(y,m,d); if(m==1||m==2||m==12) ans+=1; printf("%lld\n",ans*10); } return 0; } #include<iostream>//分三部分,第一年,中间部分,最后一年。求和就是答案。(解2) #include<cstdio> #include<algorithm> using namespace std; int main() { int t; int y1,m1,d1,y2,m2,d2; int i,ys,ms,ds,sum; int b[12]={31,28,0,0,0,0,0,0,0,0,0,31}; scanf("%d",&t); while(t--) { ys=ms=ds=0; sum=0; scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2); if(y1<y2) { for(i=y1+1;i<y2;i++) { if((i%4==0)&&(i0!=0)||(i@0==0)) ys+=91; else ys+=90; } for(i=m1+1;i<=12;i++) { ms+=b[i-1]; if(((y1%4==0)&&(y10!=0)||(y1@0==0))&&i==2) ms+=1; } for(i=d1;i<=b[m1-1];i++) { ds+=1; } for(i=1;i<m2;i++) { ms+=b[i-1]; if(((y2%4==0)&&(y20!=0)||(y2@0==0))&&i==2) ms+=1; } if(m2==1||m2==2||m2==12) { for(i=1;i<=d2;i++) ds+=1; } sum=ys+ms+ds; } else { for(i=m1+1;i<m2;i++) ms+=b[i-1]; if(m1!=m2) { for(i=d1;i<=b[m1-1];i++) ds+=1; } else ds=d2-d1+1; sum=ms+ds; } printf("%d\n",sum*10); } return 0; }幸运女神在微笑:
计算机常用到的dp求解方法,从左到右依次递推求出每个坐标a[i][j]的最优解即 a[i][j]=a[i][j]+max(a[i-1][j],a[i][j-1],a[i-1][j-1]);a[i][j]代表的含义是到(i,j)坐标能获得的最大值。
#include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; const int N=10000+100; int a[1010][1010]; int f(int x,int y,int z) { int c=x>y?x:y; return c>z?c:z; } int main() { int t,kcase=1; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]+=f(a[i-1][j],a[i][j-1],a[i-1][j-1]); printf("Case #%d:\n",kcase++); printf("%d\n",a[n][m]); } return 0; } 因吹斯听:斐波那契数列,可以做一发了。不解释。 #include<bits/stdc++.h> #include<cstdio> using namespace std; typedef long long ll; int a[100]; ll b[100]; void init() { int n=90; memset(a,0,sizeof(a)); a[1]=a[2]=1; for(int i=3;i<=90;i++) { a[i]=a[i-1]+a[i-2]; a[i]%=60; } b[1]=b[2]=1; for(int i=3;i<=n;i++) b[i]=b[i-1]+b[i-2]; return; } int main() { init(); int t,o; scanf("%d%d",&t,&o); while(t--) { int n; scanf("%d",&n); if(a[n]==o) {printf("interesting\n");} else cout<<b[n]<<endl; } return 0; } 剪刀石头布: 无敌的你,肯定要输出 who else? #include<bits/stdc++.h> #include<cstdio> using namespace std; int main() { char a[10000]; int t; while(t--) { cin>>a; } printf("Who else?\n"); return 0; } nyist-sw
