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)

posted @ 2020-07-04 18:25  Echo宝贝儿  阅读(301)  评论(0编辑  收藏  举报