• “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 G


    最近,盛大计划开发一款手游,以下是简化版。系统和我方各有 头怪兽,每一头怪兽都有生命值和攻击力,并且当怪兽A攻击怪兽B,如果怪兽B的生命值高于怪兽A的攻击力,则怪兽B的生命力减少A的攻击力的数值,否则怪兽B将死亡。我方已经通过一些手段得知了系统怪兽的出战序列,我方想要知道,我方是否可以合理安排怪兽的出战序列,保证当系统的 头怪兽全部死亡时,而我方至少还存在一头怪兽。

    所有怪兽是每秒攻击一次,即如果A和B战斗,A受到B的伤害的同时,B也受到A的伤害,直到一方死亡,换序列中的下一个怪兽,继续战斗。

    第一行一个整数 ,表示测试组数。
    对于每组数据,第一行输入一个整数1<=n<=10  , 表示怪兽的数目。
    接下来 行,表示系统 头怪兽的出战序列,每一行两个整数 , , 1<=v<=1000  , 1<=a<=100  . 其中 表示生命值, 表示攻击力。
    接下来 行,表示我方 头怪兽,但是出战序列可以由我方自己安排。每行两个整数,含义类似。

    每组数据输出一行。如果我方可以通过合理安排怪兽的出战序列,保证当系统的 头怪兽全部死亡,而我方至少还存在一头怪兽,那么输出YES;否则输出NO

    复制
    2
    2
    5 4
    4 3
    3 2
    5 4
    2
    5 4
    4 3
    3 2
    5 5
    
    NO
    YES
    解法:
    1 必须知道这是炉石
    2 数字很小我们可以考虑全排列
    3 每种情况我们和第一种去比较(模拟过程)
     1 #include<bits/stdc++.h>
     2 #define N 123456
     3 #define LL long long
     4 using namespace std;
     5 struct Node{
     6     int x;
     7     int y;
     8 }node[N],nod[N];
     9 int n;
    10 int t;
    11 int ans[N];
    12 int Solve(int ans[]){
    13     Node pos1[N];
    14     Node pos2[N];
    15 
    16     for(int i=0;i<n;i++){
    17         pos1[i].x=nod[i+1].x;
    18         pos1[i].y=nod[i+1].y;
    19 
    20     }
    21 
    22     for(int i=0;i<n;i++){
    23         pos2[i].x=node[ans[i]].x;
    24         pos2[i].y=node[ans[i]].y;
    25 
    26     }
    27     int s=0,e=0;
    28     while(s<n&&e<n){
    29         while(pos1[s].x>0&&pos2[e].x>0){
    30             pos1[s].x-=pos2[e].y;
    31             pos2[e].x-=pos1[s].y;
    32         }
    33         if(pos1[s].x<=0){
    34             s++;
    35         }
    36         if(pos2[e].x<=0){
    37             e++;
    38         }
    39     }
    40     if(s>=n&&e<n) return 1;
    41     return 0;
    42 }
    43 int main(){
    44     scanf("%d",&t);
    45     while(t--){
    46         scanf("%d",&n);
    47         for(int i=0;i<n;i++){
    48             ans[i]=i+1;
    49         }
    50         for(int i=1;i<=n;i++){
    51             scanf("%d%d",&nod[i].x,&nod[i].y);
    52         }
    53         for(int i=1;i<=n;i++){
    54             scanf("%d%d",&node[i].x,&node[i].y);
    55         }
    56         int flag=0;
    57         do{
    58             if(Solve(ans)){
    59                 flag=1;
    60                 break;
    61             }
    62         }while(next_permutation(ans,ans+n));
    63         if(flag){
    64             printf("YES
    ");
    65         }else{
    66             printf("NO
    ");
    67         }
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    使用hibernate利用实体类生成表和利用表生成实体类
    多线程循环打印ABC
    maven在整合springmvc+hibernate运行时遇到的一些问题
    checkbox属性获取
    glib中关于线程池的一个实例
    阅读英文文献总结的专业词汇
    网络流分类领域牛人
    锐捷s3550千兆交换机配置端口镜像
    转载Wireshark过滤语法
    DispatcherServlet处理流程
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/7163738.html
Copyright © 2020-2023  润新知