题目链接: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;
}