HDU4536 XCOM Enemy Unknown(dfs)
题目链接。
分析:
用dfs枚举每一波攻击的三个国家。
很暴力,但没想到0ms。
#include <iostream> #include <cstdio> #include <vector> using namespace std; const int maxn = 20; int p[maxn], nervous[maxn], n, m, k, max_cnt; int att[110][3]; void dfs(int cn) { //界限 if(max_cnt >= k) return ; if(cn >= k) { max_cnt = k; return ; } int a[3], bak[3]; for(int v=0; v<3; v++) { //枚举支援的国家 /* * 被支援的国家为 att[cn][v] * 其他两个国家为 att[cn][(v+1)%3] 和 att[cn][(v+2)%3] */ a[0] = att[cn][v]; //将国家序号存起来,方便调用 a[1] = att[cn][(v+1)%3]; a[2] = att[cn][(v+2)%3]; bak[0] = nervous[a[0]]; //备份 bak[1] = nervous[a[1]]; bak[2] = nervous[a[2]]; nervous[a[0]] -= 2; if(nervous[a[0]] < 1) nervous[a[0]] = 1; nervous[a[1]] += 2; nervous[a[2]] += 2; //数据已经保证受攻击的3个国家一定在不同的洲 for(int i=0; i<n; i++) { if(p[i] == p[a[1]] && i != a[1]) nervous[i]++; if(p[i] == p[a[2]] && i != a[2]) nervous[i]++; } //价差是否都小于5 int flag = true; for(int i=0; i<n; i++) { if(nervous[i] > 5) { max_cnt = max(max_cnt, cn); flag = false; } } if(flag) dfs(cn+1); //还原 for(int i=0; i<n; i++) { if(p[i] == p[a[1]] && i != a[1]) nervous[i]--; if(p[i] == p[a[2]] && i != a[2]) nervous[i]--; } nervous[a[0]] = bak[0]; nervous[a[1]] = bak[1]; nervous[a[2]] = bak[2]; } } int main(){ int T; scanf("%d", &T); for(int kase=1; kase<=T; kase++) { scanf("%d%d%d", &n, &m, &k); for(int i=0; i<n; i++) { scanf("%d", &p[i]); } for(int i=0; i<n; i++) { scanf("%d", &nervous[i]); } for(int i=0; i<k; i++) { scanf("%d %d %d", &att[i][0], &att[i][1], &att[i][2]); } max_cnt = 0; printf("Case #%d: ", kase); //搜索 dfs(0); printf("%d\n", max_cnt); } return 0; }