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;
}
相關文章
相關標籤/搜索