水水的DFS
来源:互联网 发布:java rest服务 编辑:程序博客网 时间:2024/04/28 14:26
原题http://acm.hdu.edu.cn/showproblem.php?pid=4536
XCOM Enemy Unknown
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 851 Accepted Submission(s): 257
Problem Description
XCOM-Enemy Unknown是一款很好玩很经典的策略游戏.
在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.
随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择3个国家攻击,作为联盟的指挥者,你要安排有限的联盟军去支援其中一个国家,抵抗进攻这个国家的外星人.
战斗胜利之后这个被支援的国家恐慌值就会-2点(恐慌值最少减为1),而其他两个未被支援的国家恐慌值就会+2点,同时和这两个国家在相同大洲的其他国家恐慌值也会+1点.
当一个国家的恐慌值超过5点,这个国家就会对联盟失去信心从而退出联盟.
现在给你外星人将会进攻的地点,问你最多能在不失去任何一个国家信任的情况下抵挡多少次外星人的进攻.
在游戏中,由于未知的敌人--外星人入侵,你团结了世界各大国家进行抵抗.
随着游戏进展,会有很多的外星人进攻事件.每次进攻外星人会选择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
每个州至少有三个国家
每次外星人进攻一定发生在不同州的三个国家
每组数据第一行是三个整数,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
19 3 20 0 0 1 1 1 2 2 23 3 3 3 3 3 3 3 30 3 60 3 6
Sample Output
Case #1: 1Hint第一次如果选择了0,那么3和6的恐慌值就会增加到5,第二次不管怎么选择,3和6总会有一个超过5.
Source
2013腾讯编程马拉松复赛第二场(3月30日)
Recommend
liuyiding | We have carefully selected several similar problems for you: 4919 4918 4917 4916 4915
//这道题目很明显是要用沈搜,由于数据都不是很大,所以最后的时间是0秒//具体的操作过程是每次都要枚举所有的情况。如果满足则继续深搜下去,如果不满足,则将那些值都还原。要主要搜索最后结束的 条件#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <ctype.h>#include <malloc.h>#include <string.h>#include <string>#include <math.h>#include <algorithm>#include <iostream>#include <stack>#include <queue>#include <deque>#include <vector>#include <set>#include <map>using namespace std;#define N 20#define M 100 + 10int attack[M][3];int num[N];int sum[N];int n,m,k;int max_cn;int max(int a,int b){return a>b?a:b;}void DFS(int cn){int i;if(cn >= k){//这种情况是因为如果第一次就可以一直搜下去到最后max_cn = k;return ;}if(max_cn >= k){//满了。就结束搜索//max_cn = k;return ;}int a[3];int b[3];int j;for(i=0;i<3;i++){a[0] = attack[cn][i];//救助的国家的编号a[1] = attack[cn][(i+1)%3];//其余两个国家的编号a[2] = attack[cn][(i+2)%3];b[0] = sum[a[0]];//先保存下来这三个国家的值b[1] = sum[a[1]];b[2] = sum[a[2]];sum[a[0]]= sum[a[0]]-2;if(sum[a[0]] < 1){sum[a[0]] = 1;}sum[a[1]]+=2;sum[a[2]]+=2;for(j=0;j<n;j++){if(num[j]==num[a[1]] && j!=a[1]){sum[j]++;}if(num[j]==num[a[2]] && j!=a[2]){sum[j]++;}}int flag = 1;for(j=0;j<n;j++){if(sum[j] > 5){//如果有大于5的情况就说明不能继续进行下去了max_cn = max(cn,max_cn);//记录下当前最大的值flag = 0;}}if(flag == 1){//如果可以,则继续搜索下去DFS(cn+1);}//还原sum[a[0]] = b[0];sum[a[1]] = b[1];sum[a[2]] = b[2];for(j=0;j<n;j++){if(num[j]==num[a[1]] && j!=a[1]){sum[j]--;}if(num[j]==num[a[2]] && j!=a[2]){sum[j]--;}}}}int main(){int T;int cas,i;while(~scanf("%d",&T)){memset(num,0,sizeof(num));memset(sum,0,sizeof(sum));memset(attack,0,sizeof(attack));for(cas=1;cas<=T;cas++){scanf("%d%d%d",&n,&m,&k);for(i=0;i<n;i++){scanf("%d",&num[i]);}for(i=0;i<n;i++){scanf("%d",&sum[i]);}for(i=0;i<k;i++){scanf("%d%d%d",&attack[i][0],&attack[i][1],&attack[i][2]);}max_cn = 0;//printf("Case #%d: %d",cas);DFS(0);printf("Case #%d: %d\n",cas,max_cn);}}return 0;}
0 0
- 水水的DFS
- hdu 1016 很水的dfs
- acm-吝啬的国度(dfs-水)
- A计划(水dfs)
- HDU 4707 水DFS
- zoj 2100 水dfs
- poj 1154dfs水
- hdoj 2212 DFS 【水】
- poj 2386 dfs 水
- poj 3620 dfs 水
- HDU 1258 【水dfs】
- lightoj 1023 水dfs
- hdu 1241 Oil Deposits(水水的dfs)
- HDU--1241 -- Oil Deposits [水水的DFS]
- poj 2386lake counting(水水的dfs)
- POJ 2245 Lotto(水水的dfs)
- POJ1562 Oil Deposits (比较水的dfs)
- poj 2488 DFS水过
- 面试笔试常考的mysql 数据库操作group by
- ORA-600 [13004] Raised With CREATE INDEX (文档 ID 1667585.1)
- 求一个整数的二进制中1的个数
- hdu4920 矩阵乘法%3
- jps 显示当前Java进程
- 水水的DFS
- poj 1837 Balance (dp,01背包)
- hdu1022火车进站(有关栈的基本问题)
- POJ 3041 Asteroids (图论-最小点覆盖)
- Struts2默认拦截器(ExceptionMappingInterceptor)的使用及源码阅读
- android模拟器自动打开搜索的BUG
- vs2010问题解决之Microsoft Visual Studio 已停止工作
- 磁盘阵列卡块区大小设置和WINDOWS簇与扇区的默认值
- 【VC编程技巧】窗体☞3.8静态窗口分割