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)