2020.06.01——习题训练4

A - Dreamoon and Ranking Collection

大题:找到一个从1开始连续的数组。条件是在给出的数组后,再给你们k个空填补这个数组,让这个数组从1开始到k是连续得,k是最大的。

做法:使用map记录出现或者没出现,然后根据x的大小枚举出多少个没有出现的数,最后得出最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n,x,maxai=-1;
        map<int,int> mp;
        cin>>n>>x;
        for(int i =1;i<=n;i++){
            int tmp;
            cin>>tmp;    
            mp[tmp]=1;
        }
        int ans;
        for(int i = 1;;i++){
            if(mp[i]==0&&x){
                x--;
                mp[i]=1;
            }
            //cout<<i<<endl;
            if(x==0&&mp[i]==0){
                ans=i-1;    
                break;
            }
        }
        cout<<ans<<endl;    
        
    } 
    return 0;
}

C - Exercising Walk

题意:判断走得步数能不能只在这个四边形中。

做法:思维题,考虑全部情况就行,如果走的绝对值步数会大于绝对值半径,那必NO,再判断一下特殊情况,就是位置只有一个点的时候,也是NO,根本走不动。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

int main(){
    int t;
    cin>>t;
    while(t--){
        int a,b,c,d,x,y,x1,y1,x2,y2;
        cin>>a>>b>>c>>d;
        cin>>x>>y>>x1>>y1>>x2>>y2;
        if((a-b)-(x-x1)<=0&&(b-a)-(x2-x)<=0&&(c-d)-(y-y1)<=0&&(d-c)-(y2-y)<=0){
            if(a&&(x-x1)==0&&(x2-x)==0)
                cout<<"NO"<<endl;
            else if(b&&(x2-x)==0&&(x-x1)==0)
                cout<<"NO"<<endl;
            else if(c&&(y-y1)==0&&(y2-y)==0)
                cout<<"NO"<<endl;
            else if(d&&(y2-y)==0&&(y-y1)==0)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
        }
            
        else
            cout<<"NO"<<endl;
    } 
    return 0;
}

D - Composite Coloring

题意:根据1~11个质数,对数组进行分类。

做法:直接先求出这11个质数,输入的时候进行判断是不是第一次,是第一次,颜色加1.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;

bool is(int n){
    for(int i =2;i<=sqrt(n);i++)
    if(n%i==0) return false;
    return true;
}

int n,a0[1007], a[1007], ans[1007], res[1007],cnt,k;


int main(){
    for(int i =2;cnt<11;i++)
    if(is(i)) a0[++cnt]=i;
    cin>>k;
    while(k--){
        cin>>n;
        int t=0;
        memset(res,0,sizeof(res));
        for(int i =1;i<=n;i++){
            cin>>a[i];
            for(int j =1;j<=11;j++){
                if(a[i]%a0[j]==0){
                    if(res[j]) ans[i]=res[j];
                    else ans[i]=res[j]=++t;
                    break;
                }
            }
        }
        cout<<t<<endl;
        for(int i =1;i<=n;i++){
            if(i!=1)
                cout<<" ";
            cout<<ans[i];
        }
        cout<<"\n";
        
    } 
    return 0;
}

E - K-th Beautiful String

题意。根据给的长度,和大小输出一个字符,包括俩b,其余都是a;

做法:很简单的排序,从右往左看,当前b在倒数第二位时,后b只有1中可能,当前b在倒数第三的时候,后b两种可能。而且是从小到大的顺序,就可以的出,这种顺序就算1+2+3+4+5+6,我们就判断一下大小在那个区间就可能的出前b的位置,后b的位置亦然。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;


int t,n, a[1007], ans[1007], res[1007],k,sum;



int main(){
    cin>>t;
    while(t--){
        cin>>n>>k;
        sum=0;
        int r;
        for(int i = 1;;i++){
            sum+=i;
            r=i;
            if(sum>=k)
                break;
        }
        r=n-r;
        k=sum-k;
        for(int i =1;i<=n;i++){
            if(i==r)
                cout<<"b";
            else if(i==(r+k+1))
                cout<<"b";
            else
                cout<<"a";
        }
        cout<<"\n";
            
        
    } 
    return 0;
}

F - Carousel

 题意:用最少的颜色给一个圆环边上的元素涂颜色,不相同的不能吐一样的颜色。

做法:这样最大也就3种颜色。

第一种可能是都一样,都一种颜色。第二种是数组长度为偶数,直接输出12121212……,第三种是长度为奇数,但是若,数组中间有连续的相同的元素,他们两个可以一样的颜色,然后接着12121212。第四种就是最后的元素和最开头的元素相等,只能12121212……3(第三种不成立再用)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+10;

int t,n,k,a[MAXN]; 

int main(){
    cin>>k;
    while(k--){
        int flag=0;
        cin>>n;
        int pos=-1;
        for(int i =0;i<n;i++){
            cin>>a[i];
            if(i!=0&&a[i]!=a[i-1]) flag=1;
            if(i!=0&&a[i]==a[i-1]) pos=i;
        }
        
        if(a[0]!=a[n-1])  flag=1;
        if(a[0]==a[n-1])  pos= 0;
        

        if(flag==0){
            cout<<"1"<<endl;
            for(int i =0;i<n;i++){
                if(i!=0)
                    cout<<" ";
                cout<<"1";
            }
            cout<<endl;
        }
        else if(n%2==0){
            cout<<"2"<<endl;
            for(int i =0;i<n;i++){
                if(i%2)
                    cout<<"2";
                else
                    cout<<"1";
                if(i!=n-1)
                    cout<<" ";
            }
            cout<<endl;
        }
        else{
            if(pos!=-1){
                cout<<"2"<<endl;
                int tmp=2;
                for(int i=0;i<n;i++){
                    if(i==pos) {
                        if(tmp==1)
                            tmp=2;
                        else
                            tmp=1;
                    }
                if(tmp==1)
                            tmp=2;
                        else
                            tmp=1;
                    if(i!=0)
                        cout<<" ";
                    cout<<tmp; 
                }
            
                cout<<endl;
            }
            else if(flag==1){
                cout<<"3"<<endl;
                for(int i =1;i<n;i++){
                    if(i%2)
                        cout<<"1";
                    else
                        cout<<"2";
                    
                    cout<<" ";
                }    
                cout<<"3"<<endl;
                
            }        
        }    
    } 
    return 0;
}

 

posted @ 2020-06-05 10:25  Leviathan_Sei  阅读(129)  评论(0)    收藏  举报