Jan
26
SGU 171 解题手记
2008 解题报告 Popularity: 1%
贪心。将所有的学生按weight从大到小排序,然后按顺序让每个人去刚好能去的zone(即没邀请满人的zone中level刚好小于这个学生的),如果没地方可去,就暂时记为“无处可去”。最后,把所有“无处可去”的学生随意分配到没满的zone。
Submit 1: AC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <cstdio> #include <algorithm> using namespace std; struct student { int id,level,weight; }; bool operator <(const student &a,const student &b) { return a.weight>b.weight; } struct zone { int id,level,cap; }; bool operator <(const zone &a,const zone &b) { return a.level>b.level; } bool operator <(int level,const zone &a) { return a.level<level; } int main() { student students[16000]; zone zones[100]; int invite[16001]; int k,n=0; scanf("%d",&k); for (int i=0;i<k;i++) { scanf("%d",&zones[i].cap); zones[i].id=i+1; n+=zones[i].cap; } for (int i=0;i<k;i++) scanf("%d",&zones[i].level); for (int i=0;i<n;i++) { scanf("%d",&students[i].level); students[i].id=i+1; } for (int i=0;i<n;i++) scanf("%d",&students[i].weight); sort(zones,zones+k); sort(students,students+n); for (int i=0;i<n;i++) { zone *p=upper_bound(zones,zones+k,students[i].level); while (p-zones<k && p->cap==0) p++; if (p-zones<k) { invite[students[i].id]=p->id; p->cap--; } else invite[students[i].id]=-1; } for (int i=1,firstzone=0;i<=n;i++) { if (invite[i]==-1) for (int j=firstzone;j<k;j++) if (zones[j].cap) { invite[i]=zones[j].id; zones[j].cap--; firstzone=j; break; } printf("%d ",invite[i]); } return 0; } |
- http://www.briefdream.com/sgu-171/
- Tags:SGU, 排序, 贪心
- (0)comments | leave a reply
- Trackback URI