HDU 4950 Monster
小模拟题。找到推断的临界条件。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
__int64 h,a,b,k,sum;
int main()
{
int i=0;
while(scanf("%I64d%I64d%I64d%I64d",&h,&a,&b,&k)&&(a+b+h+k))
{
i++;
bool flag=0;
sum=h;
if(a>=h) flag=1;
if(sum-k*a+(k-1)*b<1) flag=1;
if(a*k-b*(k+1)>0) flag=1;
if(flag==1)cout<<"Case #"<<i<<": YES"<<endl;
else cout<<"Case #"<<i<<": NO"<<endl;
}
return 0;
}
HDU 4952 Number Transformation
这个题的数据量是比較大的,要是直接暴搞的话肯定是会T的。可是打表之后就发现了规律;
#include<iostream>
#include<cstdio>
using namespace std;
__int64 x,k;
int main()
{
int i=0;
while(scanf("%I64d%I64d",&x,&k)&&(x+k))
{
__int64 y;
int t=0;
for(int i=2;i<=k;i++)
{
if(x%i)
{
if(t>100) break;
y=x/i;
y++;
x=y*i;
y=x/i;
t++;
cout<<i<<" "<<y<<" "<<x<<endl;
}
}
}
return 0;
}
发现到x/(i+1)小于i+1之后。x/(i+1)的值是不会变化的;
事实上官方是有公式证明的;
以下是代码。
#include<iostream>
#include<cstdio>
using namespace std;
__int64 x,k;
int main()
{
int j=0;
while(scanf("%I64d%I64d",&x,&k)&&(x+k))
{
__int64 y;
j++;
bool flag=0;
for(int i=2; i<=k; i++)
{
if(x%i)
{
y=x/i;
y++;
x=y*i;
y=x/i;
if(y<i)
{
flag=1;
break;
}
}
}
if(flag==1) printf("Case #%d: %I64d\n",j,y*k);
else printf("Case #%d: %I64d\n",j,x);
}
return 0;
}