2020.06.01——习题训练4

A - Dreamoon and Ranking Collection

给定n个排名,和x次将要举行的比赛,x次比赛可能取得任意名称,使名称可以连成1,2,3...v连续的数,求v的最大值

从1开始遍历,如果这个名次没有就记录,到x次后,继续遍历,看看是否还连续

int main()
{
    int k,n,i,x,b,j;
    cin>>k;
    while(k--){
        int a[510]={0};
        cin>>n>>x;
        for(i=0;i<n;i++){
            cin>>b;
            a[b]++;
        }
        int count=0;
        i=0;
        while(count<x){
            i++;
            if(a[i]==0){
                count++;
            }

        }
        while(ture){
            i++;
            if(a[i]==0){
                break;
            }
        }
        cout<<i-1<<endl;
    }
    return 0;
}

 

B - Dreamoon Likes Permutations

将一组数分成两部分,判断能不能分成两个从1开始连续的数组

最多只有两种可能,(数组的最大值max),(max,n-max),(n-max,max),找出最大值,判断这两种情况能不能成立

int a[200100],c[200100],ans[10][10];
int cnt,n,ma;
int cf(int x,int y){
    int i;
    for(i=1;i<=n;i++){
         c[i]=0;
    }
    for(i=1;i<=x;i++){
        c[a[i]]=1;
    }
    for(i=1;i<=x;i++){
        if(c[i]==0)
        return 0;
    }
    for(i=1;i<=n;i++){
        c[i]=0;
    }
    for(i=x+1;i<=n;i++){
        c[a[i]]=1;
    }
    for(i=1;i<=y;i++){
        if(c[i]==0){
        return 0;
        }
    }
    return 1;
}

int main()
{
    int k;
    cin>>k;
    while(k--){
        cin>>n;
        int ma=-1,cnt=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            ma=max(ma,a[i]);
        }
        if(cf(ma,n-ma)){
            cnt++;
            ans[cnt][1]=ma;
            ans[cnt][2]=n-ma;
        }
        if(ma*2!=n&&cf(n-ma,ma)){
            cnt++;
            ans[cnt][1]=n-ma;
            ans[cnt][2]=ma;
        }
        cout<<cnt<<endl;
        for(int i=1;i<=cnt;i++){
            cout<<ans[i][1]<<" "<<ans[i][2]<<endl;
        }
    }
    return 0;
}

 

C - Exercising Walk

初始位置在(x,y),分别向前后左右走a,b,c,d步,能否在(x1,x2)(y1,y2)这个区域内;

向前走的和向后走的抵消,算出最终位置,在不在区域内,

再判断过程中会不会走出去

int main()
{
    int k,a,b,c,d,x,y,x1,x2,y1,y2;
    cin>>k;
    while(k--){
        cin>>a>>b>>c>>d;
        cin>>x>>y;
        cin>>x1>>y1>>x2>>y2;
        x=-a+b+x;
        y=-c+d+y;
        if(x==x1&&x==x2&&(a||b)||y==y1&&y==y2&&(c||d))
        {
            cout<<"No"<<endl;
        }
        else
        {
            if(x>=x1&&x<=x2&&y>=y1&&y<=y2)
            {
                cout<<"Yes"<<endl;
            }
            else
            {
                cout<<"No"<<endl;
            }
        }

    }
    return 0;
}

D - Composite Coloring

给一串数涂色,最多涂11个颜色,相同颜色的最大公因数大于1

从2开始的十一个质数,最小的质数因数相同的涂一个颜色

 

int main()
{
    int k,n,i,a[12]={2,3,5,7,11,13,17,19,23,29,31},b[1010],x,j;
    cin>>k;
    while(k--){
        cin>>n;
        int c[15]={0},ccc=0;
        for(i=0;i<n;i++){
            cin>>x;
            for(j=0;j<11;j++){
                if(x%a[j]==0){
                    if(c[j]!=0){
                      b[i]=c[j];
                    }else{
                    ccc++;
                    c[j]=ccc;
                    b[i]=ccc;
                    }
                    break;
                }
            }
        }
        cout<<ccc<<endl;
        for(i=0;i<n;i++){
            cout<<b[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

E - K-th Beautiful String

找规律,先确实第一个b在第几位,(等差数列求和?),n-sum,就是第二个b的位置

 

int main()
{
    int k,n,i,j,sum,t;
    cin>>t;
    while(t--){
        cin>>n>>k;
        sum=0;
        for(i=0;;i++){
            if(sum+i+1>k-1){
                break;
            }
            sum+=i+1;
        }
        k-=sum+1;
        for(j=0;j<n;j++){
            if(j==n-i-2||j==n-k-1){
                cout<<'b';
            }
            else{
                cout<<'a';
            }
        }
        cout<<endl;
    }
    return 0;
}

 

 

 

 

F - Carousel

看不懂题目(இωஇ )

我看题解去了

 

posted @ 2020-06-04 13:25  一只幽灵飘过  阅读(122)  评论(0编辑  收藏  举报