UVALive

来源:互联网 发布:软件需求变更流程图 编辑:程序博客网 时间:2024/05/21 10:35

                                                       题目传送门

题意:给你n个军队,让你去攻打m个敌军,每支队伍(敌我双方)都有两个属性值,攻击力和防御力,问能否把敌军全部击灭,如果能的话我军最多能剩下多少支军队(如果我军攻击力>=敌军防御力&&我军的防御力>敌军的攻击力那么这支军队可以击杀敌军并且安全返回)

思路:又是策略问题,选择正确的策略是解决这个问题的关键。

我的策略是:首先对敌我双方进行排序,我方按攻击力排序,敌方按防御力排序,然后枚举敌方军队找到性价比最高的我方军队去攻击(能击杀敌这支军的我方军队里边性能最低的)这里分为三种情况

1、我方没有能击杀这支敌军的,直接break输出-1

2.我方有能击杀敌军的,但没有能安全返回的,这时我们派出的是所有能击杀敌军的我方军队里边的防御力最小的

3.我方有能击杀敌军并且安全返回,这时我们派出所有能击杀敌军并安全返回的我放军队里边的防御力最小的


ac代码:

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int wp=1e9+1;struct troop{    int a,d;};troop a[100005],b[100005];bool cmp(troop a,troop b){    if(a.a==b.a)        return a.d<b.d;    else        return a.a>b.a;}bool cmp2(troop a,troop b){    if(a.d==b.d)        return a.a>b.a;    return a.d>b.d;}int main(){    int t,cas=1;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        for(int i=0; i<n; i++)            scanf("%d%d",&a[i].a,&a[i].d);        for(int i=0; i<m; i++)            scanf("%d%d",&b[i].a,&b[i].d);        int flag[100005];        if(n>=m)        {            sort(a,a+n,cmp);            sort(b,b+m,cmp2);            memset(flag,0,sizeof(flag));            int p=0;            int sum=0;            for(int i=0; i<m; i++)            {                int k=0;                int q=0;                int min1=wp;                int min2=wp;                int ph=-1;                int ph1=-1;                for(int j=0; j<n; j++)                {                    if(a[j].a>=b[i].d&&a[j].d>b[i].a&&flag[j]==0)                    {                        q=1;                        if(a[j].d<min1)                        {                            min1=a[j].d;                            ph=j;                        }                    }                    if(a[j].a>=b[i].d&&flag[j]==0)                    {                        if(a[j].d<min2)                        {                            min2=a[j].d;                            ph1=j;                        }                    }                    if(a[j].a<b[i].d)                    {                        break;                    }                }                if(min1==wp&&min2==wp)                {                    p=1;                    break;                }                if(q==1)                {                    flag[ph]=1;                }                if(q==0)                {                    flag[ph1]=1;                    sum++;                }            }            printf("Case #%d: ",cas++);            if(p==1)                printf("-1\n");            else                printf("%d\n",n-sum);        }        else            printf("Case #%d: -1\n",cas++);    }    return 0;}

原创粉丝点击