1. 程式人生 > >cf1020c 瞎搞

cf1020c 瞎搞

列舉獲勝狀態即可

 
 
 
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<ctime>
#include
<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 1e9+7 #define E 1e-6 #define LL long long using namespace std; struct Node{ int num; int value; }a[N]; int bucket[N]; int ticket[N]; int cmp(Node x,Node y) { return x.value<y.value; } int main() { int
n,m; cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].num,&a[i].value); bucket[a[i].num]++;//最開始的投票情況 } sort(a+1,a+n+1,cmp); long long minn=999999999999,sum=0,ans; for(int i=bucket[1];i<=n;i++)//列舉獲勝狀態 { sum=0; ans
=0; for(int j=2;j<=m;j++) { if(bucket[j]>=i) { ticket[j]=bucket[j]-i+1;//要贏此選手需要在其處買的票數 sum+=ticket[j];//記錄要買的總票 } else ticket[j]=0; } if(i-bucket[1]<sum) continue; sum=i-bucket[1]-sum; //記錄要在比1號低的選手買的票數 for(int j=1;j<=n;j++) { if(ticket[a[j].num]!=0)//比1號高 { ticket[a[j].num]--; ans+=a[j].value; } else { if(sum!=0&&a[j].num!=1)//低且需要買票 { sum--; ans+=a[j].value; } } } minn=min(minn,ans);//取最優 } cout<<minn<<endl; return 0; }