USACO3.2--Spinning Wheels

题目的关键在于360秒后,所有的轮子都会回到原位.然后就可以暴力模拟每一秒的的情况了,因为是周期性还要注意一些细节需要注意.

代码如下:

/*
ID: 15674811
LANG: C++
TASK: spin
*/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

typedef struct
{
     int xx[6],yy[6];
     int w,cnt;
}P;
P p[6];

int flag;

void dfs(int cur,int t,int x,int y)
{
     // if(t==357)
        // cout<<x<<" "<<y<<endl;
       if(flag)  return ;
       if(cur==5)
       {
            flag=1; return ;
       }
       for(int i=0;i<p[cur].cnt;i++)
       {
             int x1=(p[cur].xx[i]+t*p[cur].w)%360;
             int y1=(p[cur].yy[i]+t*p[cur].w)%360;
             if(x>y) y+=360;
             if(x1>y1) y1+=360;
             if(y<x1)
                x+=360,y+=360;
            if(y1<x)
               x1+=360,y1+=360;
             int t1=max(x,x1);
             int t2=min(y,y1);
             if(t1<=t2)
                dfs(cur+1,t,t1%360,t2%360);
       }
}

int main()
{
       freopen("spin.in","r",stdin);
       freopen("spin.out","w",stdout);
       //freopen("in.txt","r",stdin);
       for(int i=0;i<5;i++)
       {
             scanf("%d%d",&p[i].w,&p[i].cnt);
             int tt;
             for(int j=0;j<p[i].cnt;j++)
             {
                 scanf("%d%d",&p[i].xx[j],&tt);
                 p[i].yy[j]=(p[i].xx[j]+tt)%360;
            }
       }
       int t; flag=0;
       for(t=0;t<360;t++)
       {
              int x=0,y=1360*362;
              dfs(0,t,x,y);
              if(flag)
                 break;
       }
       if(flag)
          printf("%d\n",t);
        else
           printf("none\n");
   return 0;
}
时间: 2024-10-21 14:03:12

USACO3.2--Spinning Wheels的相关文章

Spinning Wheels

Spinning Wheels 一架纺车有五个纺轮,这五个不透明的轮子边缘上都有一些缺口.这些缺口必须被迅速而准确地排列好.每个轮子都有一个起始标记(在0度),这样所有的轮子都可以在统一的已知位置开始转动.轮子按照角度变大的方向旋转,所以从起始位置开始,在一定的时间内,它们依次转过1度,2度等等(虽然这些轮子很可能不会同时转过这些角度). 这是一个整数问题.轮子不会转过1.5度或23.51234123度这样的角度.例如,轮子可能在一秒钟内转过20到25度甚至30到40度(如果转得快的话). 这个

USACO Spinning Wheels

题意是给你五个轮子, 每个轮子上有一些开口, 现在每个轮子从0位置开始转动,问最短啥时候5个轮子的开口相遇,刚开始看这道题的时候没啥思路, 就像等到最后在写,最后还没思路看了题解, 直接模拟就行, 代码如下:(注意处理边界,他不是离散的360个口,而是一个区间. /* ID: m1500293 LANG: C++ PROG: spin */ #include <cstdio> #include <cstring> #include <algorithm> using n

[模拟]纺车的轮子 Spinning Wheels

题目链接 题目大意 5个轮子 每个轮子上面有w个缺口 缺口的初始角度是n 宽度是m 每秒转速v 求当他们同时开始转的情况下,什么时候他们的缺口足以让一道阳光通过(就是有重叠部分) 思考 纯模拟题目没啥说的,就是模拟轮子转1S 2S 3S .... 10000S 每个缺口的状态 并判断一下 如果有则输出 #include <cstdio> #include <cstring> int v[6],s[6],pos[400],x[6][6],y[6][6],i,j,k,t; int ma

英文阅读--20140911NPR

Your Favorite Sites Will 'Slow Down' Today, For A Cause i Slow-loading messages will appear on some of your favorite sites Wednesday as part of a protest for net neutrality. But the sites won't actually be loading slower - the banners will be display

usaco-3.1-PROB Shaping Regions-漂浮法

漂浮法,顾名思义,就是一块块的往上飘. 以逆序来进行放置,即n to 1.逆序的好处在于放置一个矩形后,俯视看到的就是最终俯视该矩形应该看到的.因为挡着它的矩形在之前已经放置好了,所以可直接统计,为递归创造了条件.每放一个矩形,可以想象成将其扔入一密度很大的海水底部,海分成了n层,然后矩形开始向上浮.在上浮过程中若碰撞到其他的矩形则断裂成几个小矩形,继续上浮,直到浮出水面.于是想到用个递归来模拟上浮过程. /* ID: rowanha3 LANG: C++ TASK: rect1 */ #inc

Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类Truck是Car类的子类,其中包含的属性有载重量payload.每个 类都有构造方法和输出相关数据的方法.最后,写一个测试类来测试这些类的功 能. package hanqi; public class Vehicle { private int wheels; private int weight

uva10067 Playing with Wheels 【建图+最短路】

题目:uva10067 Playing with Wheels 题意:给出一个机器,有四个循环的轮子,见图,然后给出一个初始数和目标数,然后期间不能出现的数字,每一分钟可以拨动一个数,问你最短需要的时间. 分析:这个题目可以转化为求图的最短路. 因为有对于一个当前状态,有8种可以转化为的状态,那么我们可以把每一种状态转化为一个点,然后状态之间连长度 1 的边,然后求一次初始状态到目标状态的最短路. 开始的时候我们每一组数据建图一次,下来0.9s,然后优化了一下,就是在每次建图不能到达的边删除之后

A Country on Wheels【车轮上的国家】

A Country on Wheels As cultural symbols go, the American  car is quite young. 作为文化象征的美国汽车还相当年轻. The Model T Ford was built at the Piquette Plant in Michigan a century ago, with the first rolling off the assembly line on September 27, 1908. 福特T型汽车一个世纪

[usaco3.2.3]spin

这道题直接枚举就好了,但我当时竟然没想到,我真是太失败了.....Q_Q /* ID:abc31261 LANG:C++ TASK:spin */ #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int n=5,maxn=360; int s[10],first[10][10],end[10][10],num[10],f[maxn*2]; bool flag