2019 CCPC-Wannafly Winter Camp Div2 Day1

J 夺宝奇兵

范围较小,直接枚举靠多少票赢即可,不够的票从小到大买

#include<bits/stdc++.h>
#define ll long long
const int maxn = 1005;
using namespace std;
struct node
{
    ll id,val;
    int pos;
}p[maxn],P[maxn];
bool vis[maxn];
bool cmp(node u,node v)
{
    return u.val<v.val;
}
bool cmp2(node u,node v)
{
    if(u.id==v.id) return u.val>v.val;
    return u.id<v.id;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>p[i].val>>p[i].id;
        p[i].pos=i;
        P[i]=p[i];
    }
    ll ans=1e18;
    sort(P+1,P+1+m,cmp);
    sort(p+1,p+1+m,cmp2);
    for(int i=1; i<=m; i++)
    {
        memset(vis,0,sizeof(vis));
        int have=0;//当前有的票
        int need=i;//赢需要多少票
        int x=0;
        ll val=0;
        for(int j=1; j<=m; j++)
        {
            if(p[j].id!=p[j-1].id) x=1;
            else x++;
            if(x>need) //别人票数大于你赢时需要的票数
            {
                have++;
                val+=p[j].val;
                vis[p[j].pos]=1;
            }
        }
        if(have<=need) 
        {
            for(int j=1; j<=m; j++)
            {
                if(!vis[P[j].pos])
                {
                    vis[P[j].pos]=1;
                    have++;
                    val+=P[j].val;
                    if(have>need) break;
                }
            }
        }
        if(have>need)
        ans=min(ans,val);
       // cout<<i<<" "<<ans<<endl;
    }
    cout<<ans<<endl;
}
View Code

代更

猜你喜欢

转载自www.cnblogs.com/MengX/p/10326116.html