hdu5355 Cake(构造)
转载请注明出处: 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
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.
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.
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.
其实这题还是不容易过的,比赛的时候一看居然都过了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(构造)的更多相关文章
- hdu 5535 Cake 构造+记忆化搜索
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题意:给定n与m,其中1<= n <= 1e5,2 <= m <= 10;问 ...
- HDU 5355 Cake (构造 + 暴力)
题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...
- hdu5355 Cake
Problem Description There are m soda and today is their birthday. The 1-st soda has prepared n cakes ...
- HDU 5355 Cake (WA后AC代码,具体解析,构造题)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others) ...
- codeforces 1282 E. The Cake Is a Lie (dfs+构造)
链接:https://codeforces.com/contest/1282/problem/E 题意:给的是一张平面图,是一个n边形,每次可以切一刀,切出一个三角形,最终切成n-2个三角形.题目给出 ...
- Java的结构之美【1】——构造对象
当我们遇到多个构造器參数的时候可能会想到用构件器,代码例如以下: /** * 构建器 * @author 阳光小强 * */ public class Lunch { private String c ...
- [Cake] 1. CI中的Cake
在上一篇C#Make自动化构建-简介中,简单的介绍了下Cake的脚本如何编写以及通过Powershell在本地运行Cake脚本.本篇在此基础上,介绍下如何在CI环境中使用Cake. 1. Cake简介 ...
- Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)
Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...
- hdu5355 思维+爆搜
pid=5355">http://acm.hdu.edu.cn/showproblem.php?pid=5355 Problem Description There are m sod ...
随机推荐
- Fedora22没有i18n文件
今天想修改Fedora22的系统语言,发现/etc/sysconfig/没有i18n 解决方法: dnf install system-config-language.noarch -y system ...
- PHP 文件写入或追加数据
PHP file_put_contents() 函数是一次性向文件写入字符串或追加字符串内容的最合适选择. file_put_contents() file_put_contents() 函数用于把字 ...
- C程序设计语言练习题1-9
练习1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // ...
- Activiti 5.18 流程Model 转成 流程BPMN文件
直接上代码吧 byte[] bpmnBytes = null; String filename = null; JsonNode editorNode = new ObjectMapper().rea ...
- 那年曾让我哭笑不得抓狂的C语言
1.关于+=以及-= 这是两个运算符,但你否有过这种经历: int temp; char i ;i<MAX;i++) { ... temp=+; //这里本意是每次循环,temp都自增2,但是却 ...
- C51的模块化设计方法
一个大的单片机程序往往包含很多模块,我是这样组织的: 1.每一个C源文件都要建立一个与之名字一样的H文件(头文件),里面仅仅包括该C文件的函数的声明,其他的什么也不会有,比如变量的定义啊等等不应该有. ...
- windows进程间通讯的方法
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. 1.使用共享内存 代码如下: void FileMapp ...
- Android Fragment getActivity返回null解决
在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是Fragmen ...
- Android获取当前时间与星期几
public class DataString { private static String mYear; private static String mMonth; private static ...
- Linux CentOS 7 YouCompleteMe相关配置。
CentOS 6.5上面弄了2天,以失败告终!!!当作练手了.在网上看到一篇CentOS7.0上安装YouCompleteMe插件的文章,就重新在虚拟机上安装了一个CentOS7,按那个文章执行了一下 ...