原题http://acm.hdu.edu.cn/showproblem.php?pid=4536
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 851 Accepted Submission(s): 257
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
Case #1: 1Hint第一次如果选择了0,那么3和6的恐慌值就会增加到5,第二次不管怎么选择,3和6总会有一个超过5.
//这道题目很明显是要用沈搜,由于数据都不是很大,所以最后的时间是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 + 10 int 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; }
原文:http://blog.csdn.net/zcr_7/article/details/38402479