码迷,mamicode.com
首页 > 其他好文 > 详细

J Press the Button

时间:2018-09-16 20:50:18      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:ase   记录   HERE   需要   cas   out   pac   tip   The   

BaoBao and DreamGrid are playing a game using a strange button. This button is attached to an LED light (the light is initially off), a counter and a timer and functions as follows:

When the button is pressed, the timer is set to (v+0.5) seconds (no matter what the value of the timer is before the button is pressed), where v is a given integer, and starts counting down;
When the button is pressed with the LED light off, the LED light will be lit up;
When the button is pressed with the LED light on, the value of the counter will be increased by 1;
When the timer counts down to 0, the LED light goes out (that is to say, the light is off).
During the game, BaoBao and DreamGrid will press the button periodically. If the current real time (that is to say, the time elapsed after the game starts, NOT the value of the timer) in seconds is an integer and is a multiple of a given integer a, BaoBao will immediately press the button b times; If the current time in seconds is an integer and is a multiple of another given integer c, DreamGrid will immediately press the button d times.

Note that

0 is a multiple of every integer;
Both BaoBao and DreamGrid are good at pressing the button, so it takes no time for them to finish pressing;
If BaoBao and DreamGrid are scheduled to press the button at the same second, DreamGrid will begin pressing the button d times after BaoBao finishes pressing the button b times.
The game starts at 0 second and ends after t seconds (if the button will be pressed at t seconds, the game will end after the button is pressed). What‘s the value of the counter when the game ends?

Input

There are multiple test cases. The first line of the input contains an integer T (about 100), indicating the number of test cases. For each test case:

The first and only line contains six integers a, b, c, d, v and t (1≤a,b,c,d≤1e6 , 1≤v,t≤1e12 ). Their meanings are described above.

Output

For each test case output one line containing one integer, indicating the value of the counter when the game ends.

Sample Input

2
8 2 5 1 2 18
10 2 5 1 2 10

Sample Output

6
4

Hint

We now explain the first sample test case.

At 0 second, the LED light is initially off. After BaoBao presses the button 2 times, the LED light turns on and the value of the counter changes to 1. The value of the timer is also set to 2.5 seconds. After DreamGrid presses the button 1 time, the value of the counter changes to 2.
At 2.5 seconds, the timer counts down to 0 and the LED light is off.
At 5 seconds, after DreamGrid presses the button 1 time, the LED light is on, and the value of the timer is set to 2.5 seconds.
At 7.5 seconds, the timer counts down to 0 and the LED light is off.
At 8 seconds, after BaoBao presses the button 2 times, the LED light is on, the value of the counter changes to 3, and the value of the timer is set to 2.5 seconds.
At 10 seconds, after DreamGrid presses the button 1 time, the value of the counter changes to 4, and the value of the timer is changed from 0.5 seconds to 2.5 seconds.
At 12.5 seconds, the timer counts down to 0 and the LED light is off.
At 15 seconds, after DreamGrid presses the button 1 time, the LED light is on, and the value of the timer is set to 2.5 seconds.
At 16 seconds, after BaoBao presses the button 2 times, the value of the counter changes to 6, and the value of the timer is changed from 1.5 seconds to 2.5 seconds.
At 18 seconds, the game ends.

游戏规则,每个a,c倍数的时候,会按b,d次灯,如果灯关,则灯亮,如果灯亮count加一,每次按得时候,倒计时v+0.5启动,倒计时结束,灯灭,求进过t秒,count是多少

因为过了a,c的最小公倍数的时候,一切又重头,所以会有循环,因此先求一次0到最小公倍数,其他的,按比例算就好了,最后剩下的时间在算一遍

.。。中间不知道为什么,不用ll就是会爆

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h> 
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define scfff(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define prf(x) printf("%d\n",x) 
#define mm(x,b) memset((x),(b),sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+7;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
using namespace std;
const double pi=acos(-1.0);
const int N=1e7+10;
ll node1[N],node2[N];
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int re;scf(re);
    while(re--)
    {
        ll a,b,c,d;
        ll t,v,sum;
        ll ans=0;
        sf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&v,&t);
        sum=a*c/gcd(a,c);//求最小公倍数
        ll num1=sum/a,num2=sum/c;//ac各需要按几次
        rep(i,1,num1+1)//记录a要按得时间
        node1[i]=i*a;
        rep(i,1,num2+1)//记录c要按得时间
        node2[i]=i*c;
        double val;
        ll pos1=1,pos2=1;
        ans=b+d-1;val=v+0.5;
        ll now=0;//当前的时间
        ll jieshu=0;//结束标记
        while(1)
        {
            //cout<<"1"<<" "<<"pos1:"<<node1[pos1]<<" pos2:"<<node2[pos2]<<endl;
            if(node1[pos1]<node2[pos2])
            {
                if(pos1==num1&&pos2==num2)//以防a=c的时候死循环
                break;
                if(t<node1[pos1])//如果t在0到最小公倍数之间,可以提前结束,下同
                {
                    jieshu=1;
                    pf("%lld\n",ans);
                    break;
                }
                if(node1[pos1]-now<=val)//下个时间到当前时间倒计时有没有结束
                    ans+=b;
                else
                    ans+=b-1;
                
                now=node1[pos1];
                pos1++;
            }else
            {
                if(pos1==num1&&pos2==num2)
                break;
                if(t<node2[pos2])
                {
                    jieshu=1;
                    pf("%lld\n",ans);
                    break;
                }
                if(node2[pos2]-now<=val)
                    ans+=d; 
                else
                    ans+=d-1;
                
                now=node2[pos2];
                pos2++;
            }
            if(pos1==num1&&pos2==num2)
            break;
        }
        if(jieshu) continue;
        int temp=0;
        if(node1[num1]-now<=val)//开始循环的时候,灯还亮吗
        temp=1;
        ll cishu=t/node1[num1];//循环次数
        ans+=(cishu-1)*(ans+temp);
        pos1=pos2=1;
        t%=node1[num1];//剩下的时间
        ans+=temp-1+b+d;
        now=0;//重置时间
        while(1)//继续走
        {
            if(node1[pos1]<node2[pos2])
            {
                if(t<node1[pos1])
                    break;
                if(node1[pos1]-now<=val)
                    ans+=b;
                else
                    ans+=b-1;
                
                now=node1[pos1];
                pos1++;
            }else
            {
                if(t<node2[pos2])
                
                    break;
                if(node2[pos2]-now<=val)
                    ans+=d; 
                else
                    ans+=d-1;
                val=v+0.5;
                now=node2[pos2];
                pos2++;
            }
            if(pos1==num1&&pos2==num2)
            break;
        }
        pf("%lld\n",ans);
    }
    return 0;
}

J Press the Button

标签:ase   记录   HERE   需要   cas   out   pac   tip   The   

原文地址:https://www.cnblogs.com/wzl19981116/p/9657145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!