AtCoder Beginner Contest 093 D - Worst Case

在比赛时,我一直在找这道题的数学方法,知道应该从某个次小的数开始数总共比高桥分数少的人数,但是总结不出完善的情况。看了解题报告后思路通了些,写出了正确的代码。

重新写的代码如下:

#include 
#include 

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		long long a,b,c,d,e;
		scanf("%lld%lld",&a,&b);
		if(a==b)
			printf("%lld\n",2*a-2);
		else
		{
			d=a>b?a:b;
			e=a=b*a)
					printf("%lld\n",2*c-2);
				else
					printf("%lld\n",2*c-1);
			}
		}
	}
	return 0;
 } 

这道题感觉没什么算法可言,纯粹的找规律,总结情况吧。题目要我们找分数低于高桥的最大可能人数,我开始以为总分是第一场比赛和第二场比赛的分数之和,推了一段时间才明白原来是分数之积。结合解题报告,对题目的分析如下:

设高桥在第一场的得分为A,在第二场的得分为B,并且A<=B(因为正反都是一样的),有如下几种情况:

  1. 如果A=B,答案是2A-2,因为(A-1)*(A+1)=A*A-1(1,2A-1),· · · ,(A-1,A+1),(A+1,A-1),· · · , (2A -1, 1) 。所以结果是2A-2。
  2. 如果A+1=B,答案是2A-2,因为(A+2)*(A-1)=A*A+A-2(1,2A), · · · ,(A-1,A+2),(A+2,A-1),· · · ,(2A,1) 。所以结果是2A-2。
  3. 于其他情况时,令C为满足C*C
  • 如果C*(C+1)>=A*B,答案是2C-2,因为C*C=A*B,所以C可以类似地看作第一种情况中的A来处理,不过此处可从第一场比赛的C-1开始往下找,也可以从第二场比赛的C开始往下找(但是,因为C-1中有个是A,所以从第二场比赛的C开始往下找),依此类推,则有(1,A+B-1), · · · ,(A-1,B +1),(A+1,2C-A-1),· · · ,(C,C),· · · ,(2C-1,1) ,其中的2C-A-1为C+(C-(A+1))。所以答案是2C-2。
  • 如果C*(C+1)(1,A+B-1), · · · , (A-1,B+1), (A+1,2C-A), · · · ,(C,C+1),(C+1,C), · · · ,(2C,1),其中的2C-A为C+1-(C-(A+1))。所以答案为2C-1。

在实现代码的时候,我最开始c初始化为0,会导致TLE。参考了下别人的AC代码,发现直接令C等于sqrt(AB)就行,真是妙。


存疑:解题报告中有两句话不是很理解:(Note that one of "the top C - 1 places in the first contest" is Takahashi, we shouldn’t count him.) 和(Note that one of "the top places in the first contest" is Takahashi, we shouldn’t count him.) ,分别属于第三种情况里的第一二种情况。解决了这个疑点才能完善所有情况。(已解决,加入括号中)


ps:

一般TLE出现的情况有以下几种:
  1. 死循环
  2. 算法效率较低
  3. 常数较大

你可能感兴趣的:(acm)