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)