hdu 1518||poj 2362 Square(dfs)
来源:互联网 发布:我对网络教育的评价 编辑:程序博客网 时间:2024/05/10 18:16
小记:这题看重的是剪枝,但是都后来发现,其实这应该是一个当初的想法错误,导致的TLE
思路:dfs,一条边一条边的dfs,当能dfs出3条边时,就是yes。当然最开始应该判断%4是否等于0对于总长度。
而dfs的顺序就是从大到小,这点算是剪枝吧,可以少很多工作。
当没组成一条边时,就从大到小搜,一直往小的搜,
而当组成了一条边的时候就要从头开始搜。因为没组成时,可能出现加起来大于一条边的长度的。
我之前wa就出错在没组成一条边,我也是从头开始搜,唉~愚钝!
代码:
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <map>#include <set>#include <vector>#include <stack>#include <queue>#include <algorithm>using namespace std;#define mst(a,b) memset(a,b,sizeof(a))#define REP(a,b,c) for(int a = b; a < c; ++a)#define eps 10e-8const int MAX_ = 1010;const int N = 100010;const int INF = 0x7fffffff;int C[MAX_];char str[MAX_][MAX_];int a[MAX_];int vis[MAX_];int n, m, avg;int dir[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};int dfs(int sum[], int x){ bool flag = 0; REP(i, 0, 4){ if(sum[i] != avg){flag = 1;break;} } if(!flag) return 1; if(x >= n)return 0; flag = 0; int i = x; //REP(i, x, n){ if(!vis[i]){ REP(j, 0, 4){ if(sum[j] + a[i] <= avg ){ if(sum[j] == 0 && flag)continue; sum[j] += a[i]; int tmp = dfs(sum, x+1); if(tmp)return 1; sum[j] -= a[i]; if(sum[j] == 0)flag = 1; } } } //} return 0;}int dfs1(int sum, int x,int cur){ if(x == 3)return 1; //printf("%d %d ok\n",sum, x); REP(i, cur, n){ if(!vis[i]){ if(sum + a[i] == avg){ vis[i] = 1; int tmp = dfs1(0, x+1, 0); if(tmp == 1)return 1; vis[i] = 0; } else if(sum + a[i] < avg){ vis[i] = 1; int tmp = dfs1(sum + a[i], x, i); if(tmp == 1) return 1; vis[i] = 0; } } } return 0;}bool cmp(const int a, const int b){ return a > b;}int main(){ int T; scanf("%d", &T); while(T-- &&scanf("%d", &n)){ int sum = 0; REP(i, 0, n){ scanf("%d",&a[i]); sum += a[i]; } sort(a, a+n, cmp); if(sum%4 != 0 || n < 4 || a[0] > sum/4){ printf("no\n"); continue; } avg = sum/4; mst(vis, 0); int ss[4]; mst(ss, 0); int ans = dfs1(0, 0, 0);//(ss, 0); if(ans){ printf("yes\n"); }else { printf("no\n"); } }return 0;}
0 0
- hdu 1518||poj 2362 Square(dfs)
- POJ 2362 && HDU 1518 Square(dfs)
- hdu 1518 Square(DFS)
- HDU 1518 Square(DFS)
- hdu 1518 Square (DFS)
- hdu 1518 Square(DFS)
- hdu 1518 Square(dfs)
- HDU 1518 Square (DFS)
- poj 2362Square(DFS)
- POJ 2362 Square dfs
- POJ 2362 Square DFS
- dfs Square poj 2362
- DFS POJ 2362 Square
- POJ 2362 Square [DFS]
- 【POJ】2362 Square(DFS)
- poj 1518 square dfs
- dfs hdu 1518 square
- hdu 1518 Square (DFS)
- java多线程-线程间通信_生产者消费者
- UVA10129
- 进程的三个基本状态切换
- 第六天-面向对象(静态,帮助文档制作)
- java多线程-停止线程interrupt
- hdu 1518||poj 2362 Square(dfs)
- 电容常识
- X86-64寄存器和栈帧
- html css 仿微信底部自定义菜单
- mac下修改mysql-root密码-各种权限问题解决
- hibernate配置文件详解
- swift-数组测试题答案
- java多线程-守护线程
- HDU 4883 TIANKENG’s restaurant(区间选点)