A
暴力求出所有两项之和,排序。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int Max=3000*3000/2; int N,M; int x,y; int a[4000],b[Max],tail; bool cmp(int a,int b){ return a>b; } int main(){ while(scanf("%d %d",&N,&M)!=EOF){ tail=0; for(int i=0;i<N;i++)cin>>a[i]; for(int i=0;i<N-1;i++){ for(int j=i+1;j<N;j++)b[tail++]=a[i]+a[j]; } sort(b,b+N*(N-1)/2,cmp); for(int i=0;i<M;i++){if(!i)cout<<b[i]; else cout<<" "<<b[i];} cout<<endl; } return 0; }
B
排序后与原数组进行比较
#include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; struct student{ int fract,ii; string name; }A[400],B[400]; bool cmp(student a,student b){ if(a.fract!=b.fract)return a.fract>b.fract; else return a.ii<b.ii; //一直以为分数相同是按名字排序,其实按输入顺序 } int N; void print(){ for(int i=0;i<N;i++){ cout<<A[i].name<<" "<<A[i].fract<<endl; } } int main(){ while(cin>>N){ int tail=0; for(int i=0;i<N;i++){cin>>A[i].name>>A[i].fract;A[i].ii=i;} sort(A,A+N,cmp); for(int i=0;i<N;i++)cin>>B[i].name>>B[i].fract; for(int i=0;i<N;i++){ if(A[i].fract!=B[i].fract && A[i].name!=B[i].name){//比较分数是否相等 tail=1;break; } else if(A[i].fract==B[i].fract && A[i].name!=B[i].name)tail=2; // 比较名字是否相等 } if(tail==0)cout<<"Right\n"; else if(tail==1)cout<<"Error\n"; else cout<<"Not Stable\n"; if(tail){ print(); } } return 0; }
C
逐个筛选标记最大值
#include<iostream> #include<string> using namespace std; const int Max=1e4+10; struct{ string nam; int be,la; }a[Max]; int T,N; int b1,b2,b3,L1,L2,L3; int main(){ cin>>T; while(T--){ cin>>N; for(int i=0;i<N;i++){ cin>>a[i].nam; scanf("%2d:%2d:%2d %2d:%2d:%2d",&b1,&b2,&b3,&L1,&L2,&L3); a[i].be=b1*60*60+b2*60+b3;//换算方便比较 a[i].la=L1*60*60+L2*60+L3; } int sum1=a[0].be,sum2=a[0].la,ii=0,jj=0; for(int i=1;i<N;i++){ if(a[i].be<sum1){ ii=i;sum1=a[i].be; } if(a[i].la>sum2){ jj=i;sum2=a[i].la; } } cout<<a[ii].nam<<" "<<a[jj].nam<<endl; } return 0; }
D
#include<iostream> #include<string> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int Max=100000+10; int N,C; struct student{ int sno; short int fract; string name; }a[Max]; bool cmp(student x,student y){ //自定义排序 if(C==1)return x.sno<y.sno; //比较学号 else if(C==2){ if(x.name!=y.name)return x.name<y.name; //比较名字 else return x.sno<y.sno; //名字相同比较学号 } else{ if(x.fract!=y.fract)return x.fract<y.fract; else return x.sno<y.sno; } } int main(){ int tail=1; while(scanf("%d %d",&N,&C)){ if(N==0&&C==0)break; for(int i=0;i<N;i++)cin>>a[i].sno>>a[i].name>>a[i].fract; sort(a,a+N,cmp); //排序 printf("Case %d:\n",tail); for(int i=0;i<N;i++){ printf("%06d ",a[i].sno); cout<<a[i].name<<" "<<a[i].fract<<endl; } tail++; } return 0; }
E
#include<iostream> #include<algorithm> using namespace std; int main(){ int a[200010]; int m,n; while(cin>>n>>m){ for(int i=0;i<n+m;i++)cin>>a[i]; sort(a,a+m+n); for(int i=0;i<n+m;i++){ if(i && a[i]==a[i-1])continue; if(i)cout<<" " <<a[i]; else cout<<a[i]; } cout<<endl; } return 0; }
F
利用map
#include<iostream> #include<string> #include<cstring> #include<map> using namespace std; int main() { int T; cin>>T; while(T--) { string fruit,place; int num,n; cin>>n; map<string,map<string,int> >a; //双重map map<string,map<string,int> >::iterator p; while(n--){ cin>>fruit>>place>>num; a[place][fruit]+=num; } for(p=a.begin();p!=a.end();p++){ cout<<p->first<<endl; map<string,int>::iterator p1; for(p1=p->second.begin();p1!=p->second.end();p1++) cout<<" |----"<<p1->first<<"("<<p1->second<<")"<<endl; } if(T) cout<<endl; } return 0; }
G
每次输入都遍历一次数组出现重复舍去
#include<cstdio> using namespace std; const int Max=50000; int T,N; int a[Max]; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&N); int i=0; while(N--){ scanf("%d",&a[i]); for(int j=0;j<i;j++){ if(a[i]==a[j]){i--;break;} } i++; } for(int j=0;j<i;j++){ if(j)printf(" %d",a[j]); else printf("%d",a[j]); } printf("\n"); } return 0; }
H
记录并比较'('与')'数量是否一致
#include<iostream> #include<cstdio> using namespace std; int main(){ int x=0,y=0; char c; while(scanf("%c",&c)!=EOF){ if(c=='(')x++; else if(c==')')y++; } if(x==y)cout<<"YES"; else cout<<"NO"; }
I
每次选出最小的两个相加
#include<iostream> #include<algorithm> using namespace std; int T,N; int a[1010]; int main(){ cin>>T; while(T--){ cin>>N; for(int i=0;i<N;i++)cin>>a[i]; sort(a,a+N); int M=N,j=0,sum=0; N--; while(N--){ sum+=a[j]+a[j+1]; a[j+1]+=a[j]; j++; sort(a+j,a+M);//重新排序以找到最小的 } cout<<sum<<endl; } return 0; }
J
差分
#include<iostream> #include<map> using namespace std; const int Max=1e6; long long x,y; long long c[Max],ii=0; int N; int main(){ cin>>N; map<long long,int>a; for(int i=0;i<N;i++){ cin>>x>>y; a[x]++;a[y+1]--;//生成一个去掉多余项的数组 } map<long long,int>::iterator it; for(it=a.begin();it!=a.end();it++){ if(it==a.begin()){ x=it->first; y=it->second; continue; } c[y]+=it->first-x; //后一项减前一项的值为该次数 y+=it->second; x=it->first; } for(int i=1;i<=N;i++){ if(i==1)cout<<c[i]; else cout<<" "<<c[i]; } return 0; }
K
暴力查询
#include<iostream> #include<cstdio> using namespace std; const int Max=1e6+10; int a[Max]; int N,n; int main(){ while(scanf("%d",&N)!=EOF){ for(int i=0;i<Max;i++){ a[i]=0; //重新初始赋值。 } for(int i=0;i<N;i++){ cin>>n; a[n]++; //n值每出现一次,对应数组加1. } for(int i=0;i<Max;i++){ if(a[i]>=(N+1)/2){ //找出大于(N+1)/2的值即可 cout<<i<<endl; break; } } } return 0; }
M
定义multiset<int> 用来储存每瓶酒的价格,lower_bound(x)该函数查询不小于x的最小数</int>
#include<iostream> #include<cstdio> #include<set> using namespace std; const int Max=1e6+10; int N,Q,C,T; int bi; int main(){ int tail=1; cin>>T; while(T--){ cin>>N>>Q>>C; int ai; multiset<int> p; for(int i=0;i<N;i++){ scanf("%d",&ai); p.insert(ai); } printf("Case %d:\n",tail);tail++; for(int i=0;i<Q;i++){ scanf("%d",&bi); int x=1,s; auto it=p.lower_bound(bi); if(it!=p.end() && *it-bi>=0 && *it-bi<=C){ s=*it; x=0; p.erase(it); //用过一次就删除 } if(x)cout<<"-1\n"; else cout<<s<<endl; } } return 0; }
N
#include<iostream> using namespace std; int T,N; int a[1010]; int main(){ cin>>T; while(T--){ cin>>N; for(int i=0;i<N;i++)cin>>a[i]; int ii=-1,jj=N,s=1,sum1=0,sum2=0,last1=0,last2=0; while(ii+1<jj){ if(s%2==1){ ii++; int t=a[ii]; while(t<=last2&&ii+1<jj){ //如果这次糖果小于上次糖果数,则继续吃 ii++; t+=a[ii]; //本次累计糖果数 } last1=t; sum1+=t; //总累计糖果数 } else{ jj--; int t=a[jj]; while(t<=last1&&jj-1>ii){ jj--; t+=a[jj]; } last2=t; sum2+=t; } s++; } cout<<s-1<<" "<<sum1<<" "<<sum2<<endl; } return 0; }
P
#include<iostream> #include<algorithm> using namespace std; const int Max=1e5+10; int T,N; int a[Max],p[Max]; int main(){ cin>>T; int tail=1; while(T--){ cin>>N; int sum=0,ii=0,jj=0,sum_i=0,max_sum=-2000; for(int i=0;i<N;i++){ cin>>a[i]; sum+=a[i]; if(sum>max_sum){max_sum=sum;ii=sum_i;jj=i;}//刷新前项和 if(sum<0){sum_i=i+1;sum=0;} //当多项式的和出现小于零是重新计算一次前项和 } cout<<"Case "<<tail<<":\n";tail++; cout<<max_sum<<" "<<ii+1<<" "<<jj+1<<endl; if(T)cout<<endl; } return 0; }