A. Greedy Monocarp
題目大意:給你n個箱子,每個箱子有ai枚硬幣,現在有一個人會進行若干次操作:每次拿走硬幣最多的箱子,直到他的硬幣總和大於等於k。
你可以在一些箱子內增加一些硬幣,使得這個人拿走的硬幣數量最小,問你最少需要加多少枚硬幣。
思路:
看資料範圍,ai<=k,那麼可以從排序,然後令sum從大到小依次加上ai,直到加上當前ai時大於k,那麼答案就是sum+ai-k。
#include<bits/stdc++.h> using namespace std; bool cmp(int x,int y) { return x>y; } void solve() { int n,k,sum=0; cin>>n>>k; int a[100]={0}; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) { if(sum+a[i]==k) { sum+=a[i]; break; } if(sum+a[i]>k) { cout<<k-sum<<"\n"; return; } else sum+=a[i]; } cout<<k-sum<<"\n"; } int main() { int t; cin>>t; while(t--) solve(); }
B. Game with Colored Marbles
題目大意:
有n顆彈珠,第i顆彈珠的顏色為ai,Alice和Bob每次操作可以拿走一顆彈珠,Alice先手,Alice每有一個顏色不同的彈珠就會加1分,如果這個顏色是Bob沒有的,那麼再加1分。
Alice希望她的分數最大化,Bob希望Alice的分數最小化,Alice的最大分數是多少。
思路:
首先肯定先拿走只出現過一次顏色的彈珠,然後再去拿重複出現過的彈珠。
因為Bob拿走一個只出現過一次顏色的彈珠,就會讓Alice的分數少加2分,拿重複出現過的,只會讓Alice的分數少加1分,所以用雜湊統計一下即可。
#include<bits/stdc++.h> using namespace std; void solve() { int n; cin>>n; int a[1200]={0},cnt=0,ans=0; map<int,int> g; for(int i=1;i<=n;i++) cin>>a[i],g[a[i]]++; for(auto i:g) { if(i.second==1) cnt++; else ans++; } ans+=((cnt+1)/2)*2; cnt=0; cout<<ans<<"\n"; } int main() { int t; cin>>t; while(t--) solve(); }
C. Competitive Fishing
題目大意:
給你一個01字串,0為Alice釣的魚,1為Bob釣的魚,你可以將這個01串分為m組,每組必須有一條魚,假如某個人在第i組釣的魚有x條,那麼這個人的分數就會加(i-1)*x,問至少需要分多少組,使得Bob的分數超過Alice至少k分,如果無法滿足,輸出-1。
思路:
待補。