转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud

Cake

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1517    Accepted Submission(s): 233
Special Judge

Problem Description
There are m soda and today is their birthday. The 1-st soda has prepared n cakes with size 1,2,…,n. Now 1-st soda wants to divide the cakes into m parts so that the total size of each part is equal.

Note that you cannot divide a whole cake into small pieces that is each cake must be complete in the m parts. Each cake must belong to exact one of m parts.

 



Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:

The first contains two integers n and m (1≤n≤105,2≤m≤10), the number of cakes and the number of soda.
It is guaranteed that the total number of soda in the input doesn’t exceed 1000000. The number of test cases in the input doesn’t exceed 1000.

 



Output
For each test case, output "YES" (without the quotes) if it is possible, otherwise output "NO" in the first line.

If it is possible, then output m lines denoting the m parts. The first number si of i-th line is the number of cakes in i-th part. Then si numbers follow denoting the size of cakes in i-th part. If there are multiple solutions, print any of them.

 



Sample Input
4
1 2
5 3
5 2
9 3
 



Sample Output
NO
YES
1 5
2 1 4
2 2 3
NO
YES
3 1 5 9
3 2 6 7
3 3 4 8
 

其实这题还是不容易过的,比赛的时候一看居然都过了100人了,而且发现直接贪心是不对的,于是乎乱搞了一发。。。结果居然过了。。。

这题首先只有在不能整除以及n<2m-1的时候才是NO,其余情况都是YES

然后在[2m-1,4m-2]的范围内贪心,然后之后,每2m个相互构一组

 /**
* code generated by JHelper
* More info: https://github.com/AlexeyDmitriev/JHelper
* @author xyiyy @https://github.com/xyiyy
*/ #include <iostream>
#include <fstream> //#####################
//Author:fraud
//Blog: http://www.cnblogs.com/fraud/
//#####################
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <sstream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <cctype> using namespace std;
#define pb(X) push_back(X)
#define rep(X, N) for(int X=0;X<N;X++)
#define rep2(X, L, R) for(int X=L;X<=R;X++)
typedef long long ll; #define gao() out<<"NO"<<endl
vector<int> ans[];
int used[];
ll tot; class hdu5355 {
public:
int ave; void solve(std::istream &in, std::ostream &out) {
int n, m;
in >> n >> m;
tot = (ll) (n + ) * n / ;
if (tot % m != ) {
gao();
return;
}
int tmp = tot / m;
if (n < * m - ) {
gao();
return;
}
int num = n / m;
if (tmp == n) {
out << "YES" << endl;
out << << " " << n << endl;
rep(i, m - ) {
out << << " " << i + << " " << n - i - << endl;
}
return;
}
if (m == ) {
out << "YES" << endl;
out << n;
rep2(i, , n)out << " " << i;
out << endl;
return;
}
rep2(i, , m)ans[i].clear();
int f = n;
int c = ;
/*while(n>=4*m-1){
rep2(i,1,m){
if(c&1) ans[i].pb(f - i + 1);
else ans[i].pb(f - m + i);
}
f -= m;
n -= m;
c++;
rep2(i,1,m){
if(c&1) ans[i].pb(f - i + 1);
else ans[i].pb(f - m + i);
}
f -= m;
n -= m;
c++;
}*/
c = (n + - m * ) % (m * ) + m * - ;
int d = (n - c) / ( * m);
for (int i = , j = c + ; i <= m; i++) {
rep(k, d)ans[i].pb(j++), ans[i].pb(n--);
}
tot = n;
n = c;
ave = (ll) ( + n) * n / / m;
set<int> s;
rep2(i, , n)s.insert(i);
rep2(i, , m) {
rep(j, ave) {
auto it = s.upper_bound(ave - j);
ans[i].pb(*--it);
j += *it;
s.erase(it);
j--;
}
} // clr(used,0);
// rep(i,tot)a[i] = n - i;
// if(dfs(0,0,n,1)){
//if(dfs(m,n,0,0,n)){
out << "YES" << endl;
// rep2(i,1,n)ans[used[i]].pb(i);
rep2(i, , m) {
int sz = ans[i].size();
out << sz;
rep(j, sz) {
out << " " << ans[i][j];
}
out << endl;
}
//}else out<<"NO"<<endl;
/*if(n % m != 0){
gao();
return;
}
if(num&1){
if(m&1){
out<<"YES"<<endl;
run(m);
rep2(i,1,m){
out<<num;
rep(j,ans[i].size()){
out<<" "<<ans[i][j];
}
int last = 3 * m + i;
int f = 4 * m;
rep2(j,4,num){
out<<" "<<last;
f += m;
if(j&1)last = f- m + i;
else last = f - i + 1;
}
out<<endl;
} }else{
gao();
return;
}
}else{
out<<"YES"<<endl;
rep2(i,1,m){
out<<num;
int last = i;
int f = m;
rep(j,num){
out<<" "<<last;
f += m;
if(j&1)last = f-i+1;
else last = f - m + i;
}
}
}*/ } bool dfs(int num, int now, int u, int m) {
if (now == ) {
int i = tot;
while (used[i])i--;
used[i] = m;
if (dfs(num + , i, i - , m))return ;
used[i] = ;
return ;
}
if (now == ave) {
if (num == tot)return ;
else return dfs(num, , tot, m + );
}
for (int i = u; i > ; i--) {
if (!used[i] && now + i <= ave) {
used[i] = m;
if (dfs(num + , now + i, i - , m))return ;
used[i] = ;
}
}
return false;
} bool dfs(int m, int n, int tot, int num, int now) {
if (!m) {
return ;
}
if (tot = ave) {
if (dfs(m - , n, , num, ))return ;
}
if (tot == ) {
int i = n;
while (used[i])i--;
used[i] = m;
if (dfs(m, n, tot + i, num + , i))return ;
used[i] = ;
return ;
}
for (int i = now; i > ; i--) {
if (!used[i] && tot + i <= ave) {
used[i] = m;
if (dfs(m, n, tot + i, num + , i - ))return ;
used[i] = ;
}
}
return false;
} }; int main() {
std::ios::sync_with_stdio(false);
std::cin.tie();
hdu5355 solver;
std::istream &in(std::cin);
std::ostream &out(std::cout);
int n;
in >> n;
for (int i = ; i < n; ++i) {
solver.solve(in, out);
} return ;
}

hdu5355 Cake(构造)的更多相关文章

  1. hdu 5535 Cake 构造+记忆化搜索

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...

  2. HDU 5355 Cake (构造 + 暴力)

    题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...

  3. hdu5355 Cake

    Problem Description There are m soda and today is their birthday. The 1-st soda has prepared n cakes ...

  4. HDU 5355 Cake (WA后AC代码,具体解析,构造题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others) ...

  5. codeforces 1282 E. The Cake Is a Lie (dfs+构造)

    链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...

  6. Java的结构之美【1】——构造对象

    当我们遇到多个构造器參数的时候可能会想到用构件器,代码例如以下: /** * 构建器 * @author 阳光小强 * */ public class Lunch { private String c ...

  7. [Cake] 1. CI中的Cake

    在上一篇C#Make自动化构建-简介中,简单的介绍了下Cake的脚本如何编写以及通过Powershell在本地运行Cake脚本.本篇在此基础上,介绍下如何在CI环境中使用Cake. 1. Cake简介 ...

  8. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

  9. hdu5355 思维+爆搜

    pid=5355">http://acm.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m sod ...

随机推荐

  1. jQuery实现的全选、反选和不选功能

    适用于网页多选后需要进行批量操作的场景(如批量删除等).如有问题希望大家可以指正.谢谢~~ HTML 我们的页面上有一个歌曲列表,列出多行歌曲名称,并匹配复选框供用户选择,并且在列表下方有一排操作按钮 ...

  2. php用get_meta_tags轻松获取网页的meta信息

    之前没发现php还有这个函数,get_meta_tags()直接就可以获取文件中meta标签的属性值,返回数组: <?php $metas = get_meta_tags('http://www ...

  3. 浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别

    先做个简单的介绍,让先有个直观的认识 == equality 等同 === identity 恒等 == 两边值类型不同的时候,要先进行类型转换,再比较. === 不做类型转换,类型不同的一定不等. ...

  4. uc/os 笔记(转)

    1.uC/OS-II中使用互斥信号对象应该注意 互斥信号对象(Mutual Exclusion Semaphore)简称Mutex,是uC/OS-II的内核对象之一,用于管理那些需要独占访问的资源,并 ...

  5. Jasper_crosstab_display a value of field in crosstab total row

    1.create a measure <measure name="myField" class="java.lang.String"> <m ...

  6. contentInset,contentsize和contentOffset区别

    contentInset,contentsize和contentOffset区别   今天看别人用到了contentInset,觉得很迷糊,于是gogle了一下,搜到了一篇分析的很好的文章,转在这里, ...

  7. 从汇编来看c语言

    一. 学习过程 从C语言的角度提出一些问题,这些问题再从汇编的角度考虑,还真的很有意思. (1) 我们用高级语言编程时,一般不可能不用到变量,但是一定要用到变量吗?还有这些变量从汇编的角度是怎么实现的 ...

  8. PHP 之mysql空字符串问题

    有一张user表如下所示:字段name不能为空. CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `a ...

  9. 利用Qt将网页保存为PDF

    灵社区文章链接http://www.ituring.com.cn/article/128717起因是在群里和大家讨论自己做一个图灵社区的客户端,说没有API不好搞,后来fairjm童鞋发了个java版 ...

  10. c语言结构体5之匿名结构体

    注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...