最近,盛大计划开发一款手游,以下是简化版。系统和我方各有n 头怪兽,每一头怪兽都有生命值和攻击力,并且当怪兽A攻击怪兽B,如果怪兽B的生命值高于怪兽A的攻击力,则怪兽B的生命力减少A的攻击力的数值,否则怪兽B将死亡。我方已经通过一些手段得知了系统怪兽的出战序列,我方想要知道,我方是否可以合理安排怪兽的出战序列,保证当系统的n 头怪兽全部死亡时,而我方至少还存在一头怪兽。
所有怪兽是每秒攻击一次,即如果A和B战斗,A受到B的伤害的同时,B也受到A的伤害,直到一方死亡,换序列中的下一个怪兽,继续战斗。
第一行一个整数T ,表示测试组数。
对于每组数据,第一行输入一个整数n
,1<=n<=10
, 表示怪兽的数目。
接下来n
行,表示系统n
头怪兽的出战序列,每一行两个整数v
,a
, 1<=v<=1000
, 1<=a<=100
. 其中v
表示生命值,a
表示攻击力。
接下来n
行,表示我方n
头怪兽,但是出战序列可以由我方自己安排。每行两个整数,含义类似。
每组数据输出一行。如果我方可以通过合理安排怪兽的出战序列,保证当系统的n 头怪兽全部死亡,而我方至少还存在一头怪兽,那么输出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 }