cf.B. National Project

题意:

有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;
}
发布了107 篇原创文章 · 获赞 3 · 访问量 7111

猜你喜欢

转载自blog.csdn.net/qq_43504141/article/details/104325210