2020年04月19日我的赛

A - Buggy Sorting

题意:这个题意就是给你一个错误的排序方式,要求你在它的这个排序方式下判断是否存在正确的运行结果。若存在正确的结果,则输出-1,不然输出一个例子说明是错误的。题目的输入是元素的个数n。ios

题解:这一题比较有意思,很容易判断出只有当n=1 or n=2时运行结果是正确的,其他的状况都是错误的。这样咱们就构造出一个序列出来就能够了。数组

代码:spa

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n<=2){
        cout<<-1;
    }else{
        for(int i=n;i>=1;i--){
            cout<<i;
            if(i!=1){
                cout<<" "; 
            }
        }
    }
    return 0;
} 

B - Increase and Decrease

题意:这一题的大概意思是给你一个长度为n的int序列。你能够选择其中任意两个数对其分别进行+1和-1操做,问在进行若干次后,最多可存在多少个相同的数。.net

题解:对同一个数组里面的两个元素进行+1和-1操做,很容易想到的一点是它的元素和老是必定的,这是一个突破点。这里咱们判断元素的和是否能被n整除,若是能,则最多的个数就是n(说明必定存在某种方式将全部的元素变为同样的),若是不能,就确定存在一个余数,这时,咱们就能够舍去这个元素,对其余的元素进行操做。则此时的元素个数就是n-1。code

代码:blog

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
    int n;
    cin>>n;
    int num[100005]={0};
    int sum=0;
    for(int i=0;i<n;i++){
        cin>>num[i];
        sum=sum+num[i];
    }
    if(sum%n==0){
        cout<<n<<endl;
    }else{
        cout<<n-1<<endl;
    }
    return 0;
} 

E - Dividing Orange

题意:这一题的大概意思是k我的平均分n*k个橘子,特别的是每一个人都有它们各自必须必须须要的一个橘子,其余的没有要求。排序

题解:这一题也是比较简单的(悔不当初),ci

代码:这里咱们只须要用一个vis数组记录一下哪个橘子被分了就能够,而后依次输出应有数量的橘子便可(同时特别关注该人特别须要橘子的编号这个须要特别判断一下)。get

代码:string

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
    ll n,k;
    cin>>n>>k;
    int num[1000]={0};
    int vis[1000]={0}; 
    int t;
    for(int i=0;i<k;i++){ 
        cin>>vis[i];
        num[vis[i]]=1;
    }
    int len=0;
    for(int i=0;i<k;i++){
        len=0;
        cout<<vis[i]<<" ";
        len++;
        for(int j=1;j<=n*k;j++){
            if(len<n&&num[j]==0){
                cout<<j;
                num[j]=1;
                len++;
                if(len<=n-1){
                    cout<<" ";
                }
            }
        } 
        cout<<endl;
    } 
    return 0;
} 

F - Undoubtedly Lucky Numbers

题意:这一题的大概意思它定义了一种特别的数,其中这个数字包含的单个数字的种类的数量不超过2种,如今给你n须要你求出在[1,n]之中存在多少个这样的数字。

题解:比赛想了半天就是没看出这是一个dfs,这里咱们能够这样想,咱们遍历[0,9]中所有的2种数字的组合,而后将它们去排列组合,小于n就放入set(能够去重)中,最后输出就能够了。

知识点:dfs 排列组合

代码:

#include<iostream>
#include<set>
#include<algorithm>
#define ll long long
using namespace std;
set<ll> st;
ll n;
void dfs(int a,int b,ll num){
    st.insert(num);
    ll ta=num*10+a;
    ll tb=num*10+b;
    if(ta&&ta<=n){
        dfs(a,b,ta);
    }
    if(tb&&tb<=n){
        dfs(a,b,tb);
    }
}
int main(){
    cin>>n;
    for(int i=0;i<=9;i++){
        for(int j=0;j<=9;j++){
            dfs(i,j,0);/*每一个数字都是从0开始的*/
        }
    }
    cout<<st.size()-1;
    return 0;
}
相关文章
相关标签/搜索