zoukankan      html  css  js  c++  java
  • 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
    ", max_cnt);
        }
    
        return 0;
    }
  • 相关阅读:
    删除重复记录
    SQL Server调试存储过程
    SQL日期格式化应用大全
    阻塞分析
    Ajax原理详细说明
    varchar和nvarchar的区别
    临时表vs.表变量以及它们对SQLServer性能的影响
    Enterprise Library系列文章回顾与总结
    关于分页控件的文章
    SQL操作全集
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3232515.html
Copyright © 2011-2022 走看看