本题就是排序+贪心,注意排序应用到结构体二级排序,需要很强的逻辑思维,巧妙运用结构体也是本题的亮点,WA了很多很多次,就是因为结构体二级排序没写好
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct soldier
{
bool if_search;
int xiao,da;
soldier():if_search(false){}
};
soldier s[2509];
int wea[40005];
bool cmp(soldier a,soldier b) //结构体二级排序,排序要求“如果符合小的在前面则返回true”
{
if(a.xiao == b.xiao) return a.da < b.da;
else
{
if(a.xiao > b.xiao && a.da <= b.da)
return true;
if(a.xiao <= b.xiao && a.da >= b.da)
return false;
if(a.xiao > b.xiao && a.da >= b.da)
return false;
if(a.xiao <= b.xiao && a.da < b.da)
return true;
}
}
int main()
{
int m,n;
while(cin>>n>>m)
{
memset(wea,0,sizeof(wea));
int zhuang = 0;
for(int i = 0;i < n;i++)
cin>>s[i].xiao>>s[i].da;
for(int i = 0;i < m;i++)
cin>>wea[i];
sort(wea,wea + m);
sort(s,s + n,cmp);
for(int i = 0;i < m;i++)
for(int j = 0;j < n;j++)
if(!s[j].if_search && wea[i] <= s[j].da &&wea[i] >= s[j].xiao)
{
zhuang++;
s[j].if_search = true;
break;
}
printf("%d\n",zhuang);
for(int i = 0;i < n;i++) //别忘了归零!不人工归零会出错
s[i].if_search = false;
}
return 0;
}