hdu 5355 Cake(构造+回溯)
来源:互联网 发布:mysql唯一性约束 编辑:程序博客网 时间:2024/05/21 17:13
题意:
给出一个蛋糕,切成1~n大小的n块,问能否在不继续切割的情况下拼凑出m等份。
解析:
首先可以求出这些蛋糕的总和
n∗(n+1)/2 ,如果总和sum%m != 0那么就不肯能被平分成m份,那么输出”NO”。
接下来计算平均数avg=sum/m ,如果平均数avg < n的话,蛋糕是不可能用完的,同样也输出”NO”。
剩下的情况蛋糕是一定能拼成”YES”的,那么可以将这些蛋糕以2*m为单位一组一组的分配,每个人拿当前这组的最大和最小,次大和次小…..
直至拿到剩下[0,4∗m] 个蛋糕之间是停止。
这时候进行暴力求解,问题变成了1~n个数字,能否拼出,和相同的m个数字,这里直接暴力搜索dfs。
总结:
这题在比赛的时候special judge坏掉了,所以有很多wa的代码也ac了。后来数据加强了,以下这份代码是可以通过数据加强的代码。
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define pb push_backusing namespace std;typedef long long ll;const int N = 1e5 + 10;vector<int> ans[15];int sumv[15], cake[N];bool vis[N];ll n, m;ll sum, avg, res, dis;void init() { memset(sumv, 0, sizeof(sumv)); memset(vis, false, sizeof(vis)); memset(cake, 0, sizeof(cake)); for(int i = 0; i <= m; i++) ans[i].clear();}bool dfs(int cur, int sum, int pos) { if(cur == m + 1) return true; for(int i = res; i >= pos; i--) { if(vis[i]) continue; if(sum + i == dis) { cake[i] = cur; vis[i] = true; if(dfs(cur+1, 0, 1)) return true; vis[i] = false; return false; }else if(sum + i < dis) { cake[i] = cur; vis[i] = true; if(dfs(cur, sum+i, i+1)) return true; vis[i] = false; } } return false;}int main() { int T; scanf("%d", &T); while(T--) { scanf("%lld%lld", &n, &m); init(); if(n & 1) sum = (n + 1) / 2 * n; else sum = n / 2 * (n + 1); if(sum % m != 0 ) { puts("NO"); continue; } avg = sum / m; if(avg < n) { puts("NO"); continue; } puts("YES"); res = n % (2 * m); if(res != 0) { res += 2 * m; res = min(n, res); } //分成2 * m份 int a, b; for(int i = n; i > res; i -= (2 * m)) { for(int k = 1; k <= m; k++) { a = i - k + 1, b = i - (2 * m) + k; ans[k].pb(a), ans[k].pb(b); sumv[k] += a, sumv[k] += b; } } dis = avg - sumv[1]; dfs(1, 0, 1); for(int i = 1; i <= res; i++) { ans[cake[i]].pb(i); } for(int i = 1; i <= m; i++) { int size = ans[i].size(); printf("%d", size); for(int k = 0; k < size; k++) { printf(" %d",ans[i][k]); } puts(""); } } return 0;}
1 0
- hdu 5355 Cake(构造+回溯)
- hdu 5355 Cake(回溯)
- Cake (hdu 5355 构造+dfs)
- hdu 5355 Cake dfs暴搜 构造
- 暴力(Cake,HDU 5355)
- HDU 5355 Cake (WA后AC代码,详细解析,构造题)
- hdu5355--Cake(构造)
- HDU 5355 Cake(数学 DFS)
- hdu 5355 Cake(贪心+搜索)
- HDU 5355 Cake
- HDU 5355 Cake
- HDU 5355 Cake
- hdu 5535 Cake 构造+记忆化搜索
- HDU 1722 Cake (GCD)
- HDU cake
- hdu---Cake
- HDU Cake
- Cake HDU
- ABAP OLE COLOR
- 在EK-TM4C1294XL板子上面使用JLINK调试说明.同样适用于ULINK系列仿真器.
- ubuntu删除非空文件夹
- 【缓存区问题】深入了解scanf()/getchar()和gets()/cin等函数
- A1002 A+B for Polynomials (25)
- hdu 5355 Cake(构造+回溯)
- PHPCMS 利用联动菜单实现分类筛选功能
- Android主线程到底是什么(一)
- DFS 和 BFS 的原理
- 堆和栈的区别
- [Leetcode]Implement Queue using Stacks
- 北京`外汇
- 遗觉&想象
- Ubuntu14.04修改开机动画