ZOJ 3508 (the war)

来源:互联网 发布:淘宝三唑仑网上什么卖 编辑:程序博客网 时间:2024/05/01 13:12

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


0 0
原创粉丝点击