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; }
代更