UESTC 1647 Battery Charging (找规律模拟)

Description

Recently, qbwj bought a powerful cellphone which performs even better than most computers. He spent lots of time on it. However, this cellphone has a very strange feature which confused qbwj. There is a battery with infinite capacity in the cellphone. On each day, qbwj has three choices: use the cellphone, charge the battery or do nothing. He cannot do using and charging on the same day. Charging on the kth day adds k units of power to the battery. If qbwj chooses to use the cellphone on the kth day, it would consume k units of power. Note that qbwj can choose to use the cellphone if and only if there are enough units of power in the battery.

Despite of the strengths of the cellphone, qbwj couldn't suffer it any more. So he decides to sell it at the end of Tth day. Today is the Sth day and the battery is empty now. He wants to know how many days at maximum he can use the cellphone before selling it out.

Note that qbwj can still choose to use the cellphone on both the Sth day and Tth day.

Input

The first line of the input will be an integer N (N <= 10000) indicating the number of cases.
For each test case, two integers are given on a single line: S T. 1 <= S <= T <= 108.

Output

Print "Case #k: d" in a single line for each test case, in which k represents the case number which starts from 1, and d is the answer.

Sample Input

3
3 6
3 9
1 100000

Sample Output

Case #1: 1
Case #2: 3
Case #3: 49994

Hint

For the first sample, we charge the cellphone on the 3rd, 4th, 5th day and use it on the 6th day.

Source

10th UESTC Programming Contest Final 

分析:简单贪心,显然电池能用则用 
因为 1、以后用要花费更多的电量;2、以后充电比现在充电要得到更多的电
量。 
第 S 天电池没电,充完电之后剩余 S 的电量 
第 S+1 天因为电量不够还需要充电,充完电之后剩下 2*S+1 的电量 
第 S+2 天使用电池,用完之后剩下 S-1 的电量,以后重复这样的步骤,也就
是说充一天电,使用一天。每进行一次这样的步骤,剩余电量减 1。所以 S 的电
量可以进行 S 次这样的步骤,也就使用了 S 天。第 3*S 天,剩余电量为 0 。然
后第 3*S+1 天又是相同的问题。因为每次 3 倍的增长,直接模拟就好了。

我的代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
    int t,cas=1,k,a,b,ans;
    scanf("%d",&t);
    while(t--)
    {
        ans=0;
        scanf("%d%d",&a,&b);
        while(a<b)
        {
            k=3*a;
            if(k<=b)
            {
                ans+=a;
                a=3*a+1;
            }
            else
            {
                ans+=(b-a)/2;break;
            }
        }
        printf("Case #%d: %d\n",cas++,ans);
    }
}
 				    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值