Description

小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件。
每次取出的球的个数两两不同。
每次取出的球的集合两两不包含。包含是指,对于两次取球,对于取的数目少的那次取球的所有球都出现在取的数目多的那次取球中,例如{1,2}和{1,2,4},{1,2}和{2,3}则不算作包含。
而小A现在突然想知道他最多能进行多少次这样的操作,并希望你能给出具体的取球方案。

Input

一个整数n。

Output

第一行一个数k,表示能进行的最多次数。
接下来k行,每行第一个整数p,表示这次取的球数,接下来p个数表示这次取的球的编号,编号只需要不同,不需要按照顺序输出,本题设有spj。
对于每个测试点,每组数据第一行正确可以获得20%的分,如果第一行和方案均正确获得100%的分。

Sample Input

4

Sample Output

2
1 1
2 3 4

Data Constraint

对于30%的数据,n<=7。
对于50%的数据,n<=20。
对于70%的数据,n<=100。
对于100%的数据,4<=n<=1000。

Solution

  • 这题我们可以采用构造法,构造出合法的取球方案。

  • 显然,答案必为 N−2N-2 (1~N-2 的取球方案)。

  • 事实上我们可以两个两个跳着处理,假设我们已经得出了 1 到 N-2 的答案,要求 N 的答案。

  • 那么就有原答案的长度为 1~N-4 ,可填的两个数分别是 N 和 N-1

  • 为了避免“包含”,我们在每行末尾都加上一个 N 。

  • 那这样答案就的长度就变成了 2~N-3 ,之后 1 的位置就填上 N-1 。

  • 最后一行填 1~N-2 ,这样显然是不会出现“包含”情况的。(不懂可以找数尝试)

  • 那么这样时间复杂度就是 O(N2)O(N^2) 。

Code

#include<cstdio>
using namespace std;
const int N=1000;
int n,num;
int f[N*2][N];
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{scanf("%d",&n);write(n-2),putchar('\n');f[num=N][0]=f[N][1]=1;if(n&1)for(int i=5;i<=n;i+=2){num--;f[num][f[num][0]=1]=i-1;for(int j=num+1;j<=num+i-4;j++) f[j][++f[j][0]]=i;for(int j=1;j<=i-2;j++) f[num+i-3][j]=j;f[num+i-3][0]=i-2;}else{f[num+1][0]=2;f[num+1][1]=2,f[num+1][2]=3;for(int i=6;i<=n;i+=2){num--;f[num][f[num][0]=1]=i-1;for(int j=num+1;j<=num+i-4;j++) f[j][++f[j][0]]=i;for(int j=1;j<=i-2;j++) f[num+i-3][j]=j;f[num+i-3][0]=i-2;}}for(int i=num;i<num+n-2;i++){write(f[i][0]);for(int j=1;j<=f[i][0];j++) putchar(' '),write(f[i][j]);putchar('\n');}
}

JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球相关推荐

  1. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  2. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串

    Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...

  3. JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row

    Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...

  4. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症

    Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...

  5. jzoj 4805. 【NOIP2016提高A组模拟9.28】跟踪 {树+dfs}

    题目 解题思路 不难发现,石神和两个陌生人的行动方式一定是最优策略. 转换一下思路,考虑对于每个点,石神是否能比两个陌生人先到达. 计算石神到达每个点的最早时间,以及两个陌生人到达每个点的最早时间. ...

  6. JZOJ 4798 【NOIP2016提高A组模拟9.24】天使的分裂

    天使的分裂 题目大意 同时满足 求 ∑ni=1Fi \sum_{i=1}^{n}F_i 数据范围 题解 题目很简单,但是看上去很难. 先将F的递推式推出来. 所以递推式为 Fn F_n= Fn−1 F ...

  7. JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护

    题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...

  8. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

  9. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列

    题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...

最新文章

  1. 第十六届全国大学生智能车竞赛全国总决赛获奖排行榜
  2. 深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式
  3. CompletableFuture源码详解之java.util.concurrent.CompletableFuture#runAsync(java.lang.Runnable)
  4. TLS,SSL,HTTPS with Python(转)
  5. C++中函数模板template和函数参数为指针,且有返回值的结合使用
  6. Keil 编译太慢怎么办?教你一招,提速10倍
  7. python文本文件csv_我的第一个Python项目:如何将杂乱无章的文本文件转换为纯净的CSV文件
  8. azure云数据库_在Azure SQL数据库中配置多重身份验证
  9. c语言 465串口编程,用C语言编写串口程序
  10. mysql 修改字段注释_MySQL数据库+命令大全,人手一份的实操攻略来啦
  11. MySQL to Hbase 数据的抽取
  12. 【AD封装】插件电感,变压器(带3D)
  13. Mockplus组件样式库一键解决风格复用
  14. 引领IT大迁徙 Emulex持续优化应用交付
  15. 嵌入式Linux设置开机自动运行程序(基于BusyBox init)
  16. 深入理解操作系统实验——bomb lab(phase_4)
  17. 【C++ Primer Plus】第6章 分支语句和逻辑运算符
  18. linux启动网络服务的命令,linux重启服务命令
  19. JavaSE 第 3 章 数组
  20. Lunch Time

热门文章

  1. Python 日常练习1
  2. 【算法】梯度消失与梯度爆炸
  3. [云炬创业基础笔记]第五章创业机会评估测试5
  4. 十二、“最是真心藏不住,一言一语总关情。”(2021.2.11)
  5. 【福利派送】浪漫七夕,不可辜负!这 8 份礼物请收下!
  6. mysql的连表查询_MySQL_连表查询
  7. python 日志不会按照日期分割_python日志切割保留一个月
  8. sql server 中将datetime类型转换为date,或者time
  9. Asp.net中一个页面多个表单的解决方案
  10. Ajax里的onreadystatechange的作用