sgu 171 Sarov zones
题意:分配一种方案,让入围的人权重和最大。
尽量让权重大的先加入,在可选的中选要求最高的。如果一个都不行,就给他分配给要求最高的(开始实现的时候忘了应选map最靠后的)。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #define mkp make_pair using namespace std; const double EPS=1e-8; const int SZ=16010,INF=0x7FFFFFFF; typedef long long lon; int k,n; int capa[SZ],qli[SZ],lel[SZ],wt[SZ]; int res[SZ]; struct nd{ int wt,lel,id; nd(int a,int b,int c):wt(a),lel(b),id(c){} };vector<nd> vct; bool cmp(nd &x,nd &y) { return x.wt>y.wt; } struct nnd{ int wt,id; nnd(int a,int b):wt(a),id(b){} bool operator<(const nnd &rbs)const { return wt<rbs.wt; } };multimap<nnd,int> mp; void init() { cin>>k; for(int i=1;i<=k;++i)cin>>capa[i],n+=capa[i]; for(int i=1;i<=k;++i) { cin>>qli[i]; if(capa[i])mp.insert(mkp(nnd(qli[i],i),capa[i])); } for(int i=1;i<=n;++i)cin>>lel[i]; for(int i=1;i<=n;++i)cin>>wt[i],vct.push_back(nd(wt[i],lel[i],i)); sort(vct.begin(),vct.end(),cmp); } void work() { for(int i=0;i<vct.size();++i) { nd &cur=vct[i]; auto it=mp.lower_bound(nnd(cur.lel,0)); if(it==mp.begin()) { it=--mp.end(); res[cur.id]=it->first.id; --(it->second); if(it->second==0)mp.erase(it); } else { --it; res[cur.id]=it->first.id; --(it->second); if(it->second==0)mp.erase(it); } } for(int i=1;i<=n;++i) { if(i!=1)cout<<" "; cout<<res[i]; }cout<<endl; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { init(); work(); } return 0; }