sgu-254 Strange Random

题目大意:

整数1~N(N<=2?106)按顺时针形成一个圈写在黑板上。你需要重复如下操作:

从当前整数移动到从当前整数按当前方向开始数的第Q(Q<=10)个整数,然后擦掉这个整数并且跳到这个整数的下一个整数。如果下一个整数是奇数,那么下一次操作方向应该是顺时针,如果是偶数应该是逆时针。

一开始你在整数1上,方向为顺时针,要你求最后留下的整数是哪个?

简单来说就是擦数字问题的改版。

解题思路:

首先看到题目的思路就是用并查集搞,时间复杂度O(N*Q),但是发现要开两个大小为N的数组,一个存顺时针,另一个是逆时针,但是sgu卡内存,所以果断放弃。

后来看到翱犇博客里说可以直接爆搜,然后写了一发,结果是超时了(估计姿势不对)

之后就膜拜了一下翱犇的代码中那段注释掉了的剪枝。

基本思想是这样的:就是每暴力执行T次操作后,就将整个环更新,把原来已经删掉的数字去掉,组成一个新的没有被删过数字的环,然后继续暴力。

然而我还是TLE了,仔细观察我发现问题在写的是

now=now%n+1而正确的姿势是now++,if(now==n+1) now=1因为取模时间长。这个很坑。。。。。。

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int n,q;
int num[2000010]={0};

int main()
{
    scanf("%d%d",&n,&q);
    int g=1,now=1,len=n/20,p=n,np;
    if(len==0) len=n;
    for(int i=1;i<=n;i++)
        num[i]=i;
    for(int i=1;i<n;++i)
    {
        for(int j=1;j<q;++j)
        {
            if(g==1)
            {
                for(;;)
                {
                    now++;
                    if(now==p+1) now=1;
                    if(num[now]!=-1)break;
                }
            }
            else
            {
                for(;;)
                {
                    now--;
                    if(now==0) now=p;
                    if(num[now]!=-1)break;
                }
            }
        }
        num[now]=-1;
        for(;;)
        {
            now++;
            if(now==p+1) now=1;
            if(num[now]!=-1)break;
        }
        if(num[now]&1) g=1;
        else g=-1;
        if(i%len==0)
        {
            np=0;
            for(int j=1;j<=p;++j)
                if(num[j]!=-1)
                {
                    num[++np]=num[j];
                    if(num[j]==num[now])now=np;
                }
            p=np;
        }
    }
    printf("%d\n",num[now]);
    return 0;
}
时间: 2024-10-06 14:58:01

sgu-254 Strange Random的相关文章

SGU 145.Strange People

时间:0.25s空间:4m 题意: 其实就是求无环第K短路. 输入: 给出n,m,k,分别代表,n个点,m条边,第k长路. 接下来m行,三个整数x,y,z,分别代表x,y之间有条费用为x的双向路.保证没有重边. 输出: 第一行两个数a,b,第k小费用a,和经过的点的个数b. 接下来b个数,代表第k短的路径. Sample Input 5 10 3 1 2 6 1 3 13 1 4 18 1 5 35 2 3 14 2 4 34 2 5 17 3 4 22 3 5 15 4 5 34 1 5 Sa

DTLS-PSK算法抓包解析***

一.DTLS -PSK PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化.高效的优点:而目前 PSK方案应用也比较广泛. 关于DTLS协议可以看看前面的文章 DTLS要点解析 本次通过模拟的DTLS程序,对DTLS-PSK 握手流程进行抓包分析,以期加深对协议本身的理解. 二.完整握手 流程 Client Server ------ ------ 1.ClientHello --------> <-------- 2..Hello

python中文件的读取与写入以及os模块

1.文件读取的三部曲:打开 ---> 操作 ----> 关闭 r(默认参数):-只能读,不能写-读取文件不存在 会报错FileNotFoundError: [Errno 2] No such file or directory: '/tmp/westos' w(写)-write only-文件不存在的时候,会自动创建新的文件-文件存在的时候,会清空文件内容并写入新的内容 a(追加):-write only-写:不会清空文件的内容,会在文件末尾追加-写:文件不存在,不会报错,会创建新的文件并写入

hostapd、/dev/random、/dev/urandom

在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上log: E/hostapd (  100): random: Cannot readfrom /dev/random: Try again I/hostapd (  100): random: Only 0/20bytes of strong random data available from

win7设置固定IP重启后无法上网,ipconfig显示为自动配置IPV4 169.254的地址

近日安装原版Win7系统打完网卡驱动补丁后,给电脑设置了固定的IP地址后一切正常,但是电脑重启后发现上不了网了,右下角网络图标有个感叹号,打开网络和共享中心-->本地连接-->详细信息-->发现IPv4的地址与ipconfig /all得到的IP地址一致,均显示为:自动配置IPv4地址:169.254.123.188(首选) 但是查看本地连接-->属性里看到之前设置的固定IP地址是没有问题的, 所以想到了应该是电脑启用了自动配置IPv4功能,导致了固定IP无法分配给电脑, 尝试用命

numpy的random模块

[说明] 翻译自官网的文档. 随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14022471, 0.96360618], #random [ 0.37601032, 0.25528411], #random [ 0.49313049, 0.94909878]]) #random randn(d0, d1, ..., dn) 返回一个样本,具有标准正态分布.

[TypeScript] Create random integers in a given range

Learn how to create random integers using JavaScript / TypeScript. /** * Returns a random int between * @param start inclusive * @param before exclusive */ export function randomInt(start: number, before: number) { return start + Math.floor(Math.rand

java中Random随机种子使用

在java中,通过Random生成随机数时,如果设置随机种子,则相同的种子,产生的随机数相同.若不设置则每次随机的不同. Random rnd = new Random(); rnd.setSeed(10);//用于设置种子. rnd.nextInt();// 用于产生随机数. rnd.nextInt(10); // 产生(0-9)数字.

random模块

首先random函数并不是一个真正的随机数,而是根据随机数算法算出来的数 random 函数返回一个从 0.0 到 1.0 的随机浮点数 (包括 0.0, 但是不包括 1.0).每次,调用 random,就会的到一个随机数. >>> import random >>> random.random()  0.9536935859948081  >>> random.random()  0.40421571099356646  randint 函数接受一个