Educational Codeforces Round 172 (Rated for Div. 2)

mingzi123發表於2024-12-03

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。

思路:

待補。

相關文章