hdu4536 水搜索
生活随笔
收集整理的這篇文章主要介紹了
hdu4536 水搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
XCOM Enemy Unknown
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 814 Accepted Submission(s): 242
Problem Description XCOM-Enemy Unknown是一款很好玩很經典的策略游戲.
在游戲中,由于未知的敵人--外星人入侵,你團結了世界各大國家進行抵抗.
隨著游戲進展,會有很多的外星人進攻事件.每次進攻外星人會選擇3個國家攻擊,作為聯盟的指揮者,你要安排有限的聯盟軍去支援其中一個國家,抵抗進攻這個國家的外星人.
戰斗勝利之后這個被支援的國家恐慌值就會-2點(恐慌值最少減為1),而其他兩個未被支援的國家恐慌值就會+2點,同時和這兩個國家在相同大洲的其他國家恐慌值也會+1點.
當一個國家的恐慌值超過5點,這個國家就會對聯盟失去信心從而退出聯盟.
現在給你外星人將會進攻的地點,問你最多能在不失去任何一個國家信任的情況下抵擋多少次外星人的進攻.
Input 第一行有一個整數T代表接下來有T組數據
每組數據第一行是三個整數,n,m,k分別代表聯盟國家的個數,大洲的個數,外星人的進攻次數.
第二行是n個數字代表各個國家所屬的大洲(大洲序號從0到m-1)
第三行是n個數字代表各個國家初始的恐慌值
接下去k行代表外星人進攻
每行有三個數字,表示該次外星人進攻的國家(國家序號從0到n-1)
[Technical Specification]
0<T<=100
8<n<=16
2<m<=5
0<k<=100
0<初始恐慌值<=5
每個州至少有三個國家
每次外星人進攻一定發生在不同州的三個國家
Output 首先輸出case數(見sample),接著輸出在不失去任何一個國家的情況下能抵擋外星人進攻最多的次數.
Sample Input 1 9 3 2 0 0 0 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 0 3 6 0 3 6
Sample Output Case #1: 1Hint 第一次如果選擇了0,那么3和6的恐慌值就會增加到5,第二次不管怎么選擇,3和6總會有一個超過5.思路:暴搜時間過得去,數據很小,每次分三種情況就行了.. #include<stdio.h> #include<string.h>#define N 20 typedef struct {int hp ,zhou; }NODE;typedef struct {int a ,b ,c; }Q;int Z[10][N]; NODE node[N]; Q qq[105];int max_ans; int K ,n;void DFS(int deep) {if(max_ans < deep) max_ans = deep;if(deep == K + 1) return ;int a = qq[deep].a;int b = qq[deep].b;int c = qq[deep].c;//1 NODE mk_node[N]; int i;for(i = 1 ;i <= n ;i ++)mk_node[i] = node[i]; node[a].hp -= 2;if(node[a].hp < 1) node[a].hp = 1;node[b].hp += 1,node[c].hp += 1;for(i = 1 ;i <= Z[node[b].zhou][0] ;i ++)node[Z[node[b].zhou][i]].hp ++;for(i = 1 ;i <= Z[node[c].zhou][0] ;i ++)node[Z[node[c].zhou][i]].hp ++;for(i = 1 ;i <= n ;i ++)if(node[i].hp > 5) break;if(i == n + 1 && max_ans != K + 1)DFS(deep + 1);for(i = 1 ;i <= n ;i ++)node[i] = mk_node[i];//2 for(i = 1 ;i <= n ;i ++)mk_node[i] = node[i]; node[b].hp -= 2;if(node[b].hp < 1) node[b].hp = 1;node[a].hp += 1,node[c].hp += 1;for(i = 1 ;i <= Z[node[a].zhou][0] ;i ++)node[Z[node[a].zhou][i]].hp ++;for(i = 1 ;i <= Z[node[c].zhou][0] ;i ++)node[Z[node[c].zhou][i]].hp ++;for(i = 1 ;i <= n ;i ++)if(node[i].hp > 5) break;if(i == n + 1 && max_ans != K + 1)DFS(deep + 1);for(i = 1 ;i <= n ;i ++)node[i] = mk_node[i];//3 for(i = 1 ;i <= n ;i ++)mk_node[i] = node[i]; node[c].hp -= 2;if(node[c].hp < 1) node[c].hp = 1;node[a].hp += 1,node[b].hp += 1;for(i = 1 ;i <= Z[node[a].zhou][0] ;i ++)node[Z[node[a].zhou][i]].hp ++;for(i = 1 ;i <= Z[node[b].zhou][0] ;i ++)node[Z[node[b].zhou][i]].hp ++;for(i = 1 ;i <= n ;i ++)if(node[i].hp > 5) break;if(i == n + 1 && max_ans != K + 1)DFS(deep + 1);for(i = 1 ;i <= n ;i ++)node[i] = mk_node[i]; }int main () {int i ,j ,m ,t ,cas = 1;int a;scanf("%d" ,&t);while(t--){scanf("%d %d %d" ,&n ,&m ,&K);memset(Z ,0 ,sizeof(Z));for(i = 1 ;i <= n ;i ++){scanf("%d" ,&node[i].zhou);node[i].zhou ++; Z[node[i].zhou][0]++;Z[node[i].zhou][Z[node[i].zhou][0]] = i;}for(i = 1 ;i <= n ;i ++)scanf("%d" ,&node[i].hp);for(i = 1 ;i <= K ;i ++){scanf("%d %d %d" ,&qq[i].a ,&qq[i].b ,&qq[i].c);qq[i].a ++ ,qq[i].b ++ ,qq[i].c ++;}max_ans = 1;DFS(1);printf("Case #%d: %d\n" ,cas ++ ,max_ans - 1);}return 0; }
總結
以上是生活随笔為你收集整理的hdu4536 水搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4720 三角形的外接圆
- 下一篇: hdu3756 三分求最小圆锥