题意:
有t组数据,每组数据有三个数n,a,b;n表示要修的路的长度,a表示修好的路的天数,b表示修不好的路的天数,要求将所有的路修完并且好的路占至少一半,问所需要的天数。
思路:
题意很好理解,实现起来也不是很难,但是不知道为什么就是一直wa,就很气。然饿一个小时改来改去,终于改对了。我分了三种情况,
第一种情况是a*2>n,那么肯定修的超过一半都是好路并且一次就修完了。
第二种情况是a>=b,就是修a天再修b天算作一次轮回的话,那好的路肯定是超过一半的,所以res也是n的值。
第三种情况就是我们容易考虑不全的情况。因为我们要保证好的路要至少占一半,那么我们先求出好路修一半需要多少个a天,以为b是大于a的,所以在同等天数下不好的路一定是大于好的路的,所以不必考虑总数会小于n,由于是除法,可能会存在有余数,那么我们当前刚好是(k2-1)个轮回,所以我们在从a天开始,知道好的路到了一半,那么这天就是最后一天,到这天为止的总天数就是我们所要求的答案。
代码:
#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long int n , g , b;
long long int res = 0;
scanf("%lld %lld %lld",&n,&g,&b);
if(g*2 >= n)
{
res = n;
}
else if(g >= b)
{
res=n;
}
else
{
long long int k1 = 0;
long long int k2 = 0;
long long int z = 0;
z = n / 2;
if(z*2<n)
z++;
k2=z/g;
if(k2*g<z)
k2++;
res=res+(k2-1)*(g+b);
if((k2-1)*g<z)
{
res=res+z-(k2-1)*g;
}
if(res < n)
res = n;
}
printf("%lld\n",res);
}
return 0;
}