爆搜
2016-07-18 20:44
316 查看
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
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
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #define maxn 1009 using namespace std; vector<int> G[10]; int z[maxn],val[maxn]; int n,m,k,ans; struct attack { int x,y,z; attack(int a=0,int b=0,int c=0):x(a),y(b),z(c) {} } ak[109]; bool fun(int zz,int index) { for(int i=0;i<G[zz].size();i++) { if(G[zz][i]==index) val[index]+=2; else val[G[zz][i]]+=1; if(val[G[zz][i]]>5) return false; } return true; } void dfs(int step) { ans=max(ans,step); if(step>=k) return; int tmp[maxn]; for(int i=0; i<n; i++) tmp[i]=val[i]; int a=ak[step].x,b=ak[step].y,c=ak[step].z; val[a]-=2; if(val[a]<1) val[a]=1; if(fun(z[b],b)&&fun(z[c],c)) dfs(step+1); for(int i=0;i<n;i++) val[i]=tmp[i]; val[b]-=2; if(val[b]<1) val[b]=1; if(fun(z[a],a)&&fun(z[c],c)) dfs(step+1); for(int i=0;i<n;i++) val[i]=tmp[i]; val[c]-=2; if(val[c]<1) val[c]=1; if(fun(z[a],a)&&fun(z[b],b)) dfs(step+1); for(int i=0;i<n;i++) val[i]=tmp[i]; } int main() { int t; cin>>t; for(int ase=1; ase<=t; ase++) { for(int j=0; j<6; j++) G[j].clear(); cin>>n>>m>>k; for(int i=0; i<n; i++) { cin>>z[i]; G[z[i]].push_back(i); } for(int i=0; i<n; i++) cin>>val[i]; for(int i=0; i<k; i++) { int a,b,c; cin>>a>>b>>c; ak[i]=attack(a,b,c); } ans=0; dfs(0); printf("Case #%d: %d\n",ase,ans); } return 0; }
相关文章推荐
- Door Man(欧拉回路)
- 新的起点,新的生活。
- Unity又称Unity Application Block
- iOS MVVM 与 RxSwift
- select case when if 的一些用法
- js验证输入精度为1的浮点数
- 31 连续子数组的最大和
- 2nd 7月18日
- iOS Crash之NSRangeException
- 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
- 2016夏季练习——线段树
- 009——hibernate单表继承:每棵类继承树使用一个表
- Machine Learning Reviews
- 12个不可不知的Sublime Text应用技巧和诀窍
- 【图解】Dev C++单步调试的方法
- JVM内存划分
- 20.嵌套类型
- 跟着廖雪峰学 JavaScript - 基础部分 - 查漏补缺
- MySQL外键的作用和创建
- utility c++ 用法