ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数球NOIP模拟----思维题

2020-04-24 20:00:44  阅读:211  来源: 互联网

标签:取球 NOIP 对于 int 样例 数球 第一行 数据 模拟


上课安排

题目

小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件。

  1. 每次取出的球的个数两两不同。

  2. 每次取出的球的集合两两不包含。

包含是指,对于两次取球,对于取的数目少的那次取球的所有球都出现在取的数目多的那次取球中,例如{1,2}和{1,2,4},{1,2}和{2,3}则不算作包含。

而小A现在突然想知道他最多能进行多少次这样的操作,并希望你能给出具体的取球方案。

输入

一个整数n。

输出样例

第一行一个数k,表示能进行的最多次数。

接下来k行,每行第一个整数p,表示这次取的球数,接下来p个数表示这次取的球的编号,编号只需要不同,不需要按照顺序输出,本题设有spj。

对于每个测试点,每组数据第一行正确可以获得20%的分,如果第一行和方案均正确获得100%的分。

样例输入

4

样例输出

2
1 1
2 2 3

备注

对于30%的数据,n<=7。

对于50%的数据,n<=20。

对于70%的数据,n<=100。

对于100%的数据,4<=n<=1000。

题解

解题思路

看到数据范围,就想到了打表。。
那正解呢?
因为数据范围是4-1000,就不管前面的数因为前面的数不符合规律
我们可以发现,k始终等于n-2,剩下就是怎么求方案了
肯定有规律
就那5为例

1
2 3
2 4 5

可以这么组成,那7的话先在每一行后面加上6,再添一行7,最后一行1到5

1 6
2 3 6
2 4 5 6
7
1 2 3 4 5

每个数都可以这样推。
我们在做的时候可以这样:
假设2有0种方案,3有1种方案{1},偶数奇数可以分别用这两个数推导

代码

#include <cstdio>
using namespace std;
const int N = 2e3+5;
int n, a[N][N], r[N];
int main() {
    scanf("%d", &n);
    printf("%d\n", n-2);
    if (n & 1) {
        a[1][++r[1]] = 1;
        for(int i = 5; i <= n; i += 2) {
            for(int j = 1; j <= i - 4; j++)
                a[j][++r[j]] = i - 1;
            a[i-3][++r[i-3]] = i;
            for(int j = 1; j <= i - 2; j++)
                a[i-2][++r[i-2]] = j;
        }
        for(int i = 1; i <= n - 2; i++) {
            printf("%d ", r[i]);
            for(int j = 1; j <= r[i]; j++)
                printf("%d ", a[i][j]);
            puts("");
        }
    }
    else {
        for(int i = 4; i <= n; i += 2) {
            for(int j = 1; j <= i - 4; j++)
                a[j][++r[j]] = i - 1;
            a[i-3][++r[i-3]] = i;
            for(int j = 1; j <= i - 2; j++)
                a[i-2][++r[i-2]] = j;
        }
        for(int i = 1; i <= n - 2; i++) {
            printf("%d ", r[i]);
            for(int j = 1; j <= r[i]; j++)
                printf("%d ", a[i][j]);
            puts("");
        }
    }
    return 0;
}

标签:取球,NOIP,对于,int,样例,数球,第一行,数据,模拟
来源: https://www.cnblogs.com/Z8875/p/12769773.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有