链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355

题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问是否存在将1~n个数分成m组,使得每组的和相等;若存在输出m行,每行表示一组的值,否则输出NO;

ps:总共T<=1000组数据,还是挺大的;


思路:预判之后,若可能存在则直接以2m为周期,从大往小构造出和相等的m组,这样就可以将n的值缩小到2m~4m-2;因为当n = 4m-1时,再次减去一个周期,下一个讨论的右边界为2m-1,易知(2m-1)*2m/2/m是可以构造出符合的m个式子的;并且坑爹的是,出题人这次的常数系数不能太大,AC的代码运行了514ms,当把n 周期缩小处改为n > 4*m-1时,直接TLE了;在搜索中系数大了不止一倍;

dfs也是比较巧妙,需要加个start来单调查找每组的数据,是最终全部m组全部求完了再return true,并不是每组完成就直接return,这样还可以修改直接选择的错误;

判断一组完成了只是将参数值复原为原始值;还有需要使用dp优化,设置了define来简写;

 #include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
#define lowbit(x) (x&(-x))
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef long long ll;
typedef unsigned int uint;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
int i,j,k,n,m,l,r;
const int N = 1e5+;
int ans[][N],aux[][N],vs[],ave,board;
int dp[][],rec[][][][];
#define def rec[board][m]
bool dfs(int tot,int id,int start)
{
if(tot == ave){id++;tot = ;start = ;} // 这是一项结束了,是另一项的开始;当然了只有全部结束时,才返回true;
if(id == m){
rep1(i,,board)if (!vs[i]){
aux[id][++aux[id][]] = i;
}
return true;
}
rep1(i,start,board){
if(tot+i > ave) return false;
if(!vs[i]){
vs[i] = ;
aux[id][++aux[id][]] = i;
if(dfs(tot+i,id,i+)) return true;
vs[i] = ,aux[id][]--;
}
}
return false;
}
bool solve(int top)
{
if(top >= *m-){
for(int i = ,j = ;i <= m;i++,j++){
ans[i][++ans[i][]] = top-*m++j;
ans[i][++ans[i][]] = top-j;
}
return solve(top-*m);
}
else{
ave = top*(top+)/m/;
//printf("%d ",ave);
board = top;
if(dp[board][m] == ){
if(dfs(,,)){
dp[board][m] = ;
rep1(i,,m)
rep1(j,,aux[i][])
def[i][j] = aux[i][j]; // define了
}
else dp[board][m] = -;
}
if(dp[board][m] == ) return true;
return false;
}
}
int main()
{
//freopen("data.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T; read1(T);
for(int kase = ;kase <= T;kase++){
MS0(vs);
rep1(i,,) ans[i][] = aux[i][] = ;
read2(n,m);
ll sum = 1LL*n*(n+)/;
if(sum%m || sum/m < n || !solve(n)){
puts("NO");
continue;
}
puts("YES");
rep1(i,,m){
printf("%d",ans[i][]+def[i][]);
rep1(j,,ans[i][])
printf(" %d",ans[i][j]);
rep1(j,,def[i][])
printf(" %d",def[i][j]);
puts("");
}
}
return ;
}

hdu 5535 Cake 构造+记忆化搜索的更多相关文章

  1. UVa 1629 Cake slicing (记忆化搜索)

    题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃,问最少切割距离是多少. 析:很容易知道是记忆化搜索,我们用dp[u][d][l][r]来 ...

  2. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

  3. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】

    任意门:https://www.nowcoder.com/acm/contest/202/F 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 1048576K,其他语言2097152K6 ...

  4. hdu 4597 Play Game(记忆化搜索)

    题目链接:hdu 4597 Play Game 题目大意:给出两堆牌,仅仅能从最上和最下取,然后两个人轮流取,都依照自己最优的策略.问说第一个人对多的分值. 解题思路:记忆化搜索,状态出来就很水,dp ...

  5. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  7. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  8. HDU 4597 Play Game (记忆化搜索博弈DP)

    题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...

  9. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

随机推荐

  1. mysql命令整理0919 不定期更新中

    1)新建数据库 create database +database_name:         查询数据库  show databases;       切换数据库   use database_na ...

  2. [ CodeVS冲杯之路 ] P1368

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...

  3. JS 在open打开的子窗口页面中调用父窗口页面的JS方法

    需求的情景如下: 1:做新增或修改等操作的时候打开一个新的浏览器窗口(使用window.open(参数等)方法) 2:在新增或修改等的页面上有返回按钮.重置按钮.保存按钮,对于返回就直接关闭此窗口(使 ...

  4. 洛谷P2751 [USACO4.2]工序安排Job Processing

    P2751 [USACO4.2]工序安排Job Processing 18通过 78提交 题目提供者该用户不存在 标签 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 一家工 ...

  5. asp.net 页面url重写

    不更改情况下,页面路径为index.aspx?id=1,现在输入页面路径index/1时,也能访问到页面,这一过程叫做url重写 ①:在一个类里制定路径重写规则,以下为自定义UrlRewriterFi ...

  6. Leetcode008. String to Integer (atoi)

    /* improvement on dealing with overflow accroding to this: * https://discuss.leetcode.com/topic/5745 ...

  7. Javascript之严格模式详解

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  8. “Sysprep 错误 + CAPI2 引起的蓝屏”的参考解决方法

    这些天我在给学校机房部署 Windows 7 系统时,遇到一些问题,在网上找了很长时间才找到,其中有一个还是英文的资料.特此分享出来,希望能给遇到同样问题的人一个参考.由于学校的机子型号不都一样,所以 ...

  9. Windows下WEB服务器的选择与搭建

    本文主要基于支持perl的web服务器的选择. 一直基于web开发,服务器都是linux下使用webmin搭建的,惭愧的说一句,这么多年,也好好研究过WEB服务器,单从这个角度,是不是可以反应出web ...

  10. 软件工程 speedsnail 第二次冲刺8

    20150525 完成任务:障碍物整体设计,实现一页多次布局: 遇到问题: 问题1 与现有资源冲突 解决1 未解决 明日任务: 蜗牛碰到线后速度方向的调整:(做优化)