zoukankan      html  css  js  c++  java
  • 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的时候也同样用到了这样的原理。

    希望同学们多多体会。

  • 相关阅读:
    CoreText实现图文混排
    iOS中的数据的存储方式
    获得自定义的所有相簿
    swift基础语法(31- swift可选类型)
    swift内存管理(30- Swift内存管理)
    swift基础语法(29- 析构方法)
    swift基础语法(27- 构造方法,带参数的构造方法,常量存储属性与构造方法,结构体构造方法)
    iOS --旋转动画
    iOS--UILabel上画横线
    iOS--(转)集成银联3.3.0
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11207942.html
Copyright © 2011-2022 走看看