首页 > 其他 > 详细

2020/4/19个人赛部分解题与补题报告

时间:2020-04-25 21:43:32      阅读:58      评论:0      收藏:0      [点我收藏+]

   A - Buggy Sorting

       题意:给n,若有n个数能按规定的排序方式输出-1,若不可以输出反例

                 类似于冒泡法排序,但没有内层排序

                 只有n=1或n=2的时候可以正确排序

    

技术分享图片
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
    int n,i;
    cin>>n;
    if(n==1||n==2){
        cout<<"-1"<<endl;
    }else{
         for(i=n;i>3;i--){
             cout<<i<< ;
         }
        cout<<"2 3 1"<<endl;
    }

    return 0;
} 
View Code

 

   B - Increase and Decrease

      题意:从给定的数组中选两个数一个加一,一个减一,求最后得到相同的数最多有几个

                加一减一会抵消最后的和不变,如果这n个数的和能被n整除则最后相同的最多有n个

                反之,会对其中一个数一直进行操作,所以最后相同的最多有n-1个

 

技术分享图片
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[100010];
int main(){
    int n,i,j,sum=0;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    if(sum%n==0){
        cout<<n<<endl;
    }else{
        cout<<n-1<<endl;
    }
    return 0;
} 
View Code

   C - Beauty Pageant

        题意:n个数a[i]  每天可以选任意个数,一共选k天,使每天的和不同,每个人同一天只能选一次

                  先从一个人的开始,a[1]、a[2]、....a[n]  有n种;

                  选两个人的时候,a[1] a[2]    a[1]a[3] .....  a[1]a[n]  有n-1种,以此类推

                  一共有 n+n-1+n-2+....+1=(n+1)*n/2>=k;

技术分享图片
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int a[55];
int main() {
    int n,k;
    int i,j,p,counts=0;
    cin>>n>>k;
    for(i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++){
        for(j=n-i+1;j>=1;j--){
            if(counts==k)
            break;
            cout<<i<< ;
            for(p=n;p>n-i+1;p--){
                cout<<a[p]<<" ";
            }
            cout<<a[j]<<endl;
            counts++;
        }
    }
    
    return 0;
}
View Code

 

  E - Dividing Orange

    题意:有一个橘子,共有n*k瓣,编号从1到n*k,有k个人 每个人都有一个想要的编号,

               每个人都分到n瓣橘子,输出每个人的分配情况          

技术分享图片
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int a[1000],b[1000];
int main(){
    int n,k,counts=1;
    int i,j;
    cin>>n>>k;
    for(i=1;i<=k;i++){
        cin>>a[i];
        b[a[i]]=1;
    }
    for(i=1;i<=k;i++){
        cout<<a[i];
        for(j=1;j<n;j++){
            while(b[counts]==1){
                counts++;
            }
            cout<<" "<<counts;
            b[counts]=1;
        }
        cout<<endl;
    }
    return 0;
} 
View Code

 

  F - Undoubtedly Lucky Numbers

     题意:给一个数n,求小于n但是每个数不能出现超过两个得相同数字。

                输出有多少种

这个是我的超时做法(我觉得应该也是对的吧)

技术分享图片
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
set<int>a;
int main(){
     int n,i,j,counts=0;
     cin>>n;
     if(n<=101){
         cout<<n<<endl;
         return 0;
     }else{
         for(i=102;i<=n;i++){
             j=i;
             while(j){
                 a.insert(j%10);
                 j=j/10;
             }
             if(a.size()==2||a.size()==1){
                 counts++;
             }
             a.clear();
         }
         cout<<counts+101<<endl;
     }
        return 0;
}
View Code

这个是看了别人的以后做的

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
set<ll>s;
ll n;
void dfs(int a,int b,ll c){
    s.insert(c);
    ll x=10*c+a;
    ll y=10*c+b;
    if(x&&x<=n){
        dfs(a,b,x);
    }
    if(y&&y<=n){
        dfs(a,b,y);
    }

}
int main(){
        int i,j;
        cin>>n;    
        for(i=0;i<=9;i++){
            for(j=0;j<=9;j++){
                dfs(i,j,0);
            }
        }
        cout<<s.size()-1<<endl;
        return 0;
}
View Code

 


       

 

2020/4/19个人赛部分解题与补题报告

原文:https://www.cnblogs.com/yy0826/p/12766507.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!