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