题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3508
注意:题意:有N个士兵,其中第 Ni 个士兵能拿起武器重量的范围为(w-Min, w-Max), 然后又给出了M件武器,重量分别为Mi(i=1,2,3,...),因为有武器的士兵的人数越多,战争越容易胜利,所以求最多可以有多少个士兵能配武器。
#include<string.h> #include<stdio.h> #include<algorithm> using namespace std; struct node{ int l, r; }ss[3000], temp; //int cmp(int a,int b) //{ // return a<b; //} int main() { int n, m, cnt, i, j, t; int a[100000]; while(scanf("%d %d", &n, &m)!=EOF) { cnt = 0; memset(a, 0, sizeof(a)); for(i=0; i<n; i++) scanf("%d %d", &ss[i].l, &ss[i].r); // 实现区间由小到大排序,以右区间为准进行排序, 如果右区间相同,则以左区间进行由大到小的排序。 for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) { if(ss[i].r > ss[j].r) { temp = ss[i]; ss[i] = ss[j]; ss[j] = temp; } if(ss[i].r == ss[j].r) { if(ss[i].l > ss[j].l) { temp = ss[i]; ss[i] = ss[j]; ss[j] = temp; } } } //哈希,存一下武器的数量 for(i=0; i<m; i++) { scanf("%d", &t); a[t]++; } // sort(a, a+m, cmp); for(i=0; i<n; i++) { int ll=ss[i].l, rr=ss[i].r; for(j=ll; j<=rr; j++) { if(a[j])//如果在此区间里存在可配备武器的士兵,则计数变量cnt++,然后对应的下表的武器数减 1 。 { a[j]--; cnt++; break; } } } printf("%d ", cnt); } return 0; }