USACO Spinning Wheels

洛谷 P2728 纺车的轮子 Spinning Wheels

https://www.luogu.org/problemnew/show/P2728

JDOJ 1800: Spinning Wheels 纺车的轮子

Description

一架纺车有五个纺轮,这五个不透明的轮子边缘上都有一些缺口.这些缺口必须被迅速而准确地排列好.每个轮子都有一个起始标记(在0 度),这样所有的轮子都可以在统一的已知位置开始转动.
轮子按照`plus degrees'方向旋转,所以从起始位置开始,在一定的时间内,它们依次转过1 度,2 度等等(虽然这些轮子很可能不会同时转过这些角度).
这是一个整数问题.轮子不会转过1.5 度或23.51234123 度这样的角度.例如,轮子可能在一秒钟内转过20 到25 度甚至30 到40 度(如果转得快的话).
这个问题中的所有角度都限制在 0 <= 角度 <= 359 这个范围内.轮子转过 359 度后接下来就是 0度.每个轮子都有一个确定的旋转速度,以秒作为单位.1 <= 速度 <= 180.
轮子上的缺口的起始角度和缺口大小(或长度)各由一个整数表示,都以度为单位.在一个轮子上,两个缺口之间至少有一度的间隔.
在起始位置,设时间为 0,所有的轮子的起始标记排列成一条直线.你的程序必须计算,最早出现每个的轮子上的缺口同其他轮子上的缺口对准(也就是一束光可以通过五个轮子上的五个缺口)情况的时间.这些缺口在任意一个角度对准.

Input

输入中的五行对应五个轮子.
第一个数字表示轮子的转动速度.下一个数字是缺口的数目 W.1 <= W <= 5.接下来的 W 对数字表示每个缺口的起始角度和长度.

Output

只有一行,包括一个整数,表示光能够通过这五个轮子的最早时间.如果无解,输出`none'小写,不含引号).

Sample Input

30 1 0 120 50 1 150 90 60 1 60 90 70 1 180 180 90 1 180 60

Sample Output

 
 这道题是一道模拟题...
(我在洛谷上搜图论题做,结果蹦出来了这个,怎么看怎么是模拟,就用模拟做了,这里告诉大家,洛谷智能推荐=坑爹玩意)
其实没什么好说的,读入处理可以有很多种方法,最后枚举时间,一层一层枚举缺口,最后就能AC掉。
我在这里想和大家探讨一下关于这种圆轮题怎么处理:
先上代码再解释:
#include<cstdio>
#include<cstring> 
using namespace std;
int speed[6];
int s[6];
int p[6][6],width[6][6];
int v[361]; 
int b[6]; 
int main() 
{
    for(int i=1;i<=5;i++)
    {
        scanf("%d%d",&speed[i],&s[i]);
        for(int j=1;j<=s[i];j++)
            scanf("%d%d",&p[i][j],&width[i][j]);
    }
    for(int t=0;t<=360;t++)
    {
        memset(v,0,sizeof(v));
        for(int i=1;i<=5;i++)
            for(int j=1;j<=s[i];j++)
            {
                for(int k=p[i][j];k<=p[i][j]+width[i][j];k++)
                    v[k%360]++; 
                p[i][j]=(p[i][j]+speed[i])%360; 
            }
        for(int i=0;i<=359;i++)
            if (v[i]==5)
            {
                printf("%d",t); 
                return 0;
            } 
    }  
    printf("none");
    return 0; 
}

在这里我采用了合理的压行。

所谓圆轮题是我给起的名,大体就是那种收尾相连的串,如果用数组的话会越界,再就会WA,因为根据题意,1的前面是n,n的后面是1,如果用数组模拟的话,我的想法是开三倍的数组,然后把串复制三份扔进去,再...

哇,麻烦死了。

所以我们想到了另外一种做法。

我们的数组不用开三倍,开一倍的即可,当我们需要找数组下标时怎么办呢?

很简单,把枚举到的数(可能会超出n的范围),对n取模即可。

很好理解吧!然后就可以进行后续的操作。

针对本题,不仅在v[k%360]的时候用到了这个思想,在它的下一行——p[i][j]=(p[i][j]+width[i][j])%360的时候也同样用到了这样的原理。

希望同学们多多体会。

posted @ 2019-07-18 16:05  Seaway-Fu  阅读(180)  评论(0编辑  收藏  举报