2020-07-04 熱身訓練賽(四)

A.(Gym-101992A)

 

B.排列(Gym-101992B)

題意:給出一個長度爲n的序列,只能對其施加添加一個數字和刪除一個數字的操作,求最少需要多少次能把序列變成1~p的排列(p不知道)。

解:枚舉p,求最小值

 

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int T,n,ans;
map<int,bool>p;
int main(){
    freopen("task.in","r",stdin);
    scanf("%d",&T);
    int x;
    while(T--){
        p.clear();
        scanf("%d",&n);
        ans=n+1;
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            p[x]=1;
        }
        int cnt=0;
        for(int i=1;i<=n*2;i++){
            if(p[i])cnt++;
            ans=min(ans,n+i-cnt*2);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

 

 

C.(Gym-101992C)

D.(Gym-101992D)

E.(Gym-101992E)

F.賽跑(Gym-101992F)

題意:上次比賽的平均成績爲N,這次比賽目前的總成績爲M,已經賽完X場,還有Y場尚未開始。求接下來的Y場需要拿到多少分才能使得本次的平均成績大於等於上次的。

解:題意用方程表示爲$N\leq \frac{M+a}{X+Y}$(a爲待求量)。整理可得$a\geq N(X+Y)-M$,還需要判斷一下是否已經輸了或者贏了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,N,M,X,Y;
int main(){
    freopen("mosalah.in","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d",&N,&M,&X,&Y);
        if(N*(X+Y)<=M){
            puts("0");
        }
        else if(Y==0&&N*(X+Y)>M){
            puts("-1");
        }
        else {
            int ans=N*(X+Y)-M;
            printf("%d\n",ans);
        }
    }
    return 0;
}

 

G.(Gym-101992G)

H.(Gym-101992H)

I.(Gym-101992I)

J.(Gym-101992J)

K.(Gym-101992K)

L.(Gym-101992L)

M.(Gym-101992M)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章