转载请注明出处: 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. C# 调用浏览器打开网址

    private void button1_Click(object sender, EventArgs e) { //调用系统默认的浏览器 System.Diagnostics.Process.Sta ...

  2. 记录一下最近开发web移动前端的过程

    两个项目 第一个是公司网站的移动端,我所在的公司是做某方面的新闻站的. 所以说页面基本是以一条条的新闻+图文混排为主,顶部有一个自动slider+触屏滑动的功能, 使用的是swipe插件,轻量,简洁非 ...

  3. PHP 汉字转拼音(首拼音,所有拼音)

    <?php /** +------------------------------------------------------ * PHP 汉字转拼音 +------------------ ...

  4. ARM 汇编器对C的扩展

    __swi void ledtest();    //:声明 edtest 是个软中断. __asm  内嵌汇编          //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字 ...

  5. NSIS脚本调用C语言写的插件

    其实NSIS的官网已经提供了很多别人开发的插件了,今天需要用到GetVersion这个插件,这是不维护的插件了,不推荐用,但是由于现实中的问题,导致我不得不用这个插件. 所以就下载下来了. 下载下来之 ...

  6. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  7. Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统

  8. 股票市场问题(The Stock Market Problem)

    Question: Let us suppose we have an array whose ith element gives the price of a share on the day i. ...

  9. JAVA车票管理系统(简单GUI)

    一.    需求分析 1.设计题目:车票管理系统 用JAVA语言和数据结构知识设计设计车票管理系统.要求如下所述: 一车站每天有n个发车班次,每个班次都有一个班次号(1.2.3…n),固定的发车时间, ...

  10. Java代码编译和执行的整个过程

    Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...