2 solutions
-
1
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n,m; const int N=1010; int cnt[N]; vector<int> cs[N]; LL cal(int aim) { int cur_cnt=cnt[1];//初始数量 vector<int> tmp; LL res=0; for(int i=2;i<=n;i++) { int buy=max(int(cs[i].size()-(aim-1)),0); //需要改变的数量 for(int j=0;j<buy;j++) //当前这一类价格低的数量 { res+=cs[i][j]; } cur_cnt+=buy; //多的肯定都是改到第一种武器 for(int j=buy;j<cs[i].size();j++) { tmp.push_back(cs[i][j]); } } sort(tmp.begin(),tmp.end()); //在武器[1]的数量为aim的情况下,多出来的武器 for(int i=0;i<aim-cur_cnt;i++) //计算还差的武器[1]的强化材料的数量 { res+=tmp[i]; } return res; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int p,c; cin>>p>>c; cnt[p]++; cs[p].push_back(c); } for(int i=1;i<=n;i++) { sort(cs[i].begin(),cs[i].end()); } LL ans=1e18; for(int i=max(cnt[1],1);i<=m;i++) //第一种武器的强化材料的数量 { ans=min(ans,cal(i)); } cout<<ans; return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1010; int a[N],b[N]; int main() { int n,m; cin>>n>>m; if(n==2) { int cnt1=0,cnt2=0; vector<int> v; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; if(x==1) cnt1++; else { cnt2++; v.push_back(y); } } int cost=0; int i=0; sort(v.begin(),v.end()); while(cnt1<=cnt2) { cost+=v[i]; i++; cnt1++,cnt2--; } cout<<cost; } if(m==2) { int ans=2e9+10; for(int i=1;i<=2;i++) cin>>a[i]>>b[i]; for(int w1=1;w1<=n;w1++) { for(int w2=1;w2<=n;w2++) { vector<int> cnt(n+1,0);//全部清0 cnt[w1]++,cnt[w2]++; bool st=true;//最开始是合法的 for(int i=2;i<=n;i++) { if(cnt[1]<=cnt[i]) { st=false;//说明不合法 break; } } if(st) { int cost=0; if(w1!=a[1]) cost+=b[1]; if(w2!=a[2]) cost+=b[2]; ans=min(ans,cost); } } } cout<<ans; } return 0; }
- 1
Information
- ID
- 2218
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 7
- Accepted
- 3
- Uploaded By