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;
}

京公网安备 11010502036488号