UESTC 170 三国

135 篇文章 0 订阅
44 篇文章 0 订阅

话说在三国时代,曹操曾亲率大军追打刘备,刘备势单力薄,只得向盟友孙权借兵,接下来,我将对这场战争作具体描述。战争发生在中国大陆上(一张二维平面),刘备的大本营在成都,坐标($0$,$0$),曹操的大军和孙权的援兵都驻扎在成都的周围,将用一个坐标点表示,不同地方驻扎的兵力有所不同,但所有人的行进速度都是单位$1$。战争一开始,曹操所有的部队同时向刘备进发,此时幸得诸葛亮神机妙算,知道曹操来了,于是就叫他的主公刘备立刻派出使者从成都出发到孙权所有的军营借兵(每个军营都派有使者,向各军营借兵是独立的;使者走后,成都的守城部队并不会减少),使者到了一个军营,那个军营所有的援兵开始启程增援成都,增援部队到达成都后将一直停留在成都,直到整场战争结束。任何一个战役的胜负只取决于双方投入兵力的多少,兵力多的方胜,少的方负,一样多则战平;所有人走的都是最短路线,且不是必须平行于$x$轴和$y$轴行走。

.*

Input

输入包含多组数据。首先输入一个整数$T$,表示有$T$组测试数据。对于每组数据,首先输入一个整数$P$,表示成都自己有的兵力;接着输入一个整数$N$,表示曹操的部队数量,接下来的$N$行,每行$3$个整数$x,y,n$,表示曹操$N$个部队的坐标,和对应部队的兵力;接着又是一个整数$M$,表示孙权的部队数量,接着的$M$行就是部队描述。 ($0 \leq P,n \leq 10000$), ($-10000 \leq x,y \leq 10000$), ($0 \leq N,M \leq 1000$)。

Output

对于每组测试数据,首先输出Case #k:,$k$为样例数,接着要是成都可以保下来(即在曹操的所有进攻中,刘备的兵力加上孙权的援兵都不少于曹操的进攻兵力),输出Yes,否则输出No。详见样例。

Sample Input

2

10
2
1 0 10
3 0 10
1
0 1 10

10
2
1 0 10
3 0 10
1
0 2 10

Sample Output

Case #1: Yes
Case #2: No

Hint

第一组样例,部队($1$,$0$)在时刻$1$到达成都,此时成都的兵力刚好能够抵抗,孙权的部队($0$,$1$)在时刻$2$到达成都,刚好抵抗时刻3到达成都的曹操的部队($3$,$0$),所以成都得保。而第二组样例中,孙权的部队($0$,$2$)要在时刻4才到成都,那时成都已经沦陷了。

注意:战役双方如果分别有人数为$a$, $b$的部队,则打完之后较多的一方剩余$abs(a - b)$的部队


#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
struct p
{
    int x,y,b;
    double a;
}c[1100],s[1100];

bool cmp(p a,p b)
{
    return a.a<b.a;
}
int main()
{
    int cas,sum,n,m;
    scanf("%d",&cas);
    for(int t=1;t<=cas;t++)
    {
        scanf("%d",&sum);
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d %d %d",&c[i].x,&c[i].y,&c[i].b);

            c[i].a=sqrt(c[i].x*c[i].x+c[i].y*c[i].y);
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].b);

            s[i].a=sqrt(s[i].x*s[i].x+s[i].y*s[i].y)*2;
        }

        sort(c,c+n,cmp);
        sort(s,s+m,cmp);

        int flag=0,j=0;
        for(int i=0;i<n;i++)
        {
            if(j<m && s[j].a<c[i].a)
            {
                sum+=s[j].b;
                j++;
                i--;
            }
            else if(j<m && s[j].a==c[i].a)
            {
                sum+=s[j].b;
                j++;
                sum-=c[i].b;
            }
            else
            {
                sum-=c[i].b;
            }

            if(sum<0)
            {
                flag=1;
                break;
            }
        }
        if(flag)
            printf("Case #%d: No\n",t);
        else printf("Case #%d: Yes\n",t);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值