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;}elsesum+=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++;elseans++;}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。
思路:
待补。