CF1443A Kids Seating 暴力 埃筛

老年人又回来打CF了,但是因为养生,熬不起夜,还是打打VP吧。

传送门:https://codeforces.com/contest/1443/problem/A

题意:

老师要给n个孩子安排座位,总共有4n个座位从1到4n编号,但是,如果两个孩子的座位编号互质,或者一个是另一个的倍数,这两个孩子就会开始折腾,找出一种让所有孩子都不折腾的座位安排方法。

题解:

按如下步骤暴力求解:

1,首先划掉所有奇数的座位,因为所有奇数都跟至少一个偶数互质。

2,让第一个孩子坐在2号座位上,划掉所有2的倍数

3,找到下一个没有被划掉的座位,让下一个孩子坐上去,并划掉所有它的倍数,以此类推

4,如果座位够就ok了,否则,回到第2步,只不过2号座位不要坐了,从4号开始,再不行就从6号开始,以此类推

代码:

#include<bits/stdc++.h>
using namespace std;
bool ans[401];
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n;
        scanf("%d",&n);
        int nn=n;
        memset(ans,0,sizeof ans);
        vector<int> ansp;
        for(int k=4; k<=4*n; k+=2) {
            memset(ans,0,sizeof ans);
            ansp.clear();
            for(int i=k; i<=4*n && ansp.size()<nn; i+=2) {
                if(ans[i]==0) {
                    //printf("%d%c",i,nn==1?'\n':' ');
                    ansp.push_back(i);
                    for(int j=2*i; j<=4*n; j+=i)ans[j]=1;
                }
                //printf("%d%c",,i==n?'\n':' ');

            }
            if(ansp.size()==nn) {
                for(int i=0; i<ansp.size(); i++) {
                    printf("%d%c",ansp[i],i==ansp.size()-1?'\n':' ');
                }
                break;
            }
        }

    }
    return 0;
}

拓展:

本题由于数据范围较小($n\ leq 100$),可以暴力出来,如果数据范围较大,该如何找到第一个孩子的座位?

暴力得出的规律是,当座位数是$4 \times n$时,第一个座位应该放在$\left \lceil  \frac{n-1}{3} \times 4 \right \rceil$号位置

posted @ 2020-11-12 15:03  Isakovsky  阅读(109)  评论(0编辑  收藏  举报