A:纯白送

#include<stdio.h>

int main()
{
    int t;
    int x,y,n,k,temp;

    scanf("%d",&t);

    while(t--)
    {
        scanf("%d %d %d",&x,&y,&n);
        temp=n-n%x;
        temp=temp+y;

        if(temp>n)
            k=temp-x;
        else
            k=temp;
        printf("%d\n",k);
    }
    return 0;    
} 

B:纯白送

include<stdio.h>
#include<iostream>

using namespace std;

int main()
{
    int t,add1,add2,k;

    cin>>t;

    while(t--)
    {
        cin>>k;
        add1=0;add2=0;

        while(k%2==0)
        {
            add1++;
            k=k/2;
        }
        while(k%3==0)
        {
            add2++;
            k=k/3;
        }
        if(k!=1||add2<add1)
        {
            printf("-1\n");
            continue;
        }
        printf("%d\n",add2*2-add1);
    }
    return 0;
}

C:纯白送。这题以前做过类似的,问你一个括号序列合法不合法,是那道题的略微加强版本。

#include<stdio.h>
#include<iostream>

using namespace std;

int main()
{
    int t,k,s,p1,p2;
    cin>>t;
    char c;

    while(t--)
    {
        s=0,p1=0,p2=0;
        cin>>k;
        c=getchar();

        while(k--)
        {
            c=getchar();
            if(c=='(')
                p1++;
            if(c==')')
                p2++;

            if(p2>p1)
            {
                s++;
                p2--;
            }
        }
        cout<<s<<endl;
    }
    return 0;
}

D:给(k-n%k)%k排个序即可,注意到要用long long。

#include<stdio.h>
#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    long long t;
    cin>>t;

    long long p[200000],q[200000],add,n,k;
    long long t1=0,t2=0,tn;

    while(t--)
    {
        cin>>n>>k;
        t1=0;t2=0;

        for(add=0;add<n;add++)
        {
            cin>>p[add];
            q[add]=k-p[add]%k;
            if(q[add]==k)
                q[add]=0;
        }

        sort(q,q+n);
        tn=0;

        for(add=1;add<n;add++)
        {
            if(q[add]==q[add-1])
                tn++;
            else
            {
                if(tn>=t1&&q[add-1]!=0)
                {
                    t1=tn;
                    t2=q[add-1];
                }

                tn=0;
            }
            //printf("?%lld %lld %lld %lld?\n",add,tn,t1,t2);
        }
        if(tn>=t1&&q[add-1]!=0)
        {
            t1=tn;
            t2=q[add-1];
        }
        if(t2==0)
        printf("%lld\n",t1*k+t2);
        else
        printf("%lld\n",t1*k+t2+1);
        /*for(add=0;add<n;add++)
        {
            printf("[%lld]",q[add]);
        }
        printf("{%lld %lld}\n\n",t1,t2);*/
    }
    return 0;
}

E:把所有只有alice喜欢的和bob喜欢的书分别排序,然后从最小的开始各挑一本加起来当做一本书,放进两个人都喜欢的的书的数组里,最后对都喜欢的书的数组排序即可。

#include<stdio.h>
#include<iostream>
#include<algorithm>

using namespace std;

long long p[200000],q[200000],r[200000];

int main()
{

    long long add,n,k,a=0,b=0,c=0,a1,b1,c1,sum=0;

    cin>>n>>k;

    for(add=0;add<n;add++)
    {
        cin>>a1>>b1>>c1;

        if(b1&&c1)
        {
            p[a]=a1;
            a++;
        } 
        else if(b1)
        {
            q[b]=a1;
            b++;
        }
        else if(c1)
        {
            r[c]=a1;
            c++;
        }
    }

    if(a+b<k||a+c<k)
    {
        printf("-1\n");
        return 0;
    }

    sort(q,q+b);
    sort(r,r+c);

    if(b<c)
    {
        for(add=a;add<a+b;add++)
        {
            p[add]=q[add-a]+r[add-a];
        }
        n=a+b;
    }
    else
    {
        for(add=a;add<a+c;add++)
        {
            p[add]=q[add-a]+r[add-a];
        }
        n=a+c;
    }

    /*printf("|");
    for(add=0;add<n;add++)
    printf("%lld ",p[add]); 
    printf("|");*/

    sort(p,p+n);

    /*printf("|");
    for(add=0;add<n;add++)
    printf("%lld ",p[add]); 
    printf("|");*/

    for(add=0;add<k;add++)
    {
        sum+=p[add];
    }

    printf("%lld",sum);
    return 0;
}

sort函数是真的方便。