ZOJ 3508 (the war)

题目链接: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\n", cnt);
    }
    return 0;
}


posted @ 2014-07-29 00:00  6bing  阅读(108)  评论(0编辑  收藏  举报