【这篇文章之前在我自己的人人日志中发过一次~】
题目链接:Power Hungry Cows
为了体现我的解法的独特性,我先大概分析一下网上的解法。网上的主流解法主要是A搜索。比如说像这个以及那个。以及还有一位大神用的是个终极打表法。这些解法可以说都不是那么简单的。A*算法并不是一个初级的算法...并且这道题的启发的要求也比较高。而那个终极打表法...我就不说什么了...不过这个东西如果代码写得太粗暴的话打表也不是那么容易在几个小时之内打出来的...
所以说,在此我要介绍的是一种简单无脑的解法。【请忽视我语言中的逻辑...】
首先,先看一下这段代码:
int n;
cin >>n;
if (n>18000) while(1);
这段代码的作用就是说如果这道题有的输入数据是>18000的话,会输出wrong answer,time=1000ms,否则time=0ms,依然wrong answer。反复利用这种方法就可以把这道题的输入数据测试出来。
接下来,看这一段代码:
int n;
cin >>n;
if (n > a)
cout right ans
else if (n == a)
cout m
else while(1);
这段代码的作用就是说如果n=a时答案是m的话,会输出TLE,否则输出wrong answer,time=1000ms。当a是最小输入值时,在n=a时答案是m的话,会输出AC,否则输出wrong answer,time=0ms。利用这个就可以把这道题的每个输入数据对应的答案测试出来。
于是,我就以226次提交,1次AC,1次CE(脑残),224次TLE||WA的战绩,成功将这道题的答案测试出来了。【有些错误用在方法探索上了,实际上用不了这么多次。但数量级上也差不多...】
最终,我就非常无脑地得到了下面这段代码:
#include<iostream>
using namespace std;
int main ()
{
int n;
cin >>n;
switch (n)
{
case 19997 : cout <<"18"<<endl; break;
case 15151 : cout <<"17"<<endl; break;
case 11111 : cout <<"17"<<endl; break;
case 10007 : cout <<"16"<<endl; break;
case 5123 : cout <<"14"<<endl; break;
case 5111 : cout <<"15"<<endl; break;
case 1234 : cout <<"13"<<endl; break;
case 1024 : cout <<"10"<<endl; break;
case 1023 : cout <<"11"<<endl; break;
case 1010 : cout <<"12"<<endl; break;
case 31 : cout <<"6"<<endl; break;
}
return 0;
}
AC 256kB 0ms 639B代码长度
如果还想要更过分一点的话还可以玩一下这一段代码:
#include<iostream>
using namespace std;main(){int n;cin>>n;if(n==19997)cout<<"18";if(n==15151)cout<<"17";if(n==11111)cout<<"17";if(n==10007)cout<<"16";if(n==5123)cout<<"14";if(n==5111)cout<<"15";if(n==1234)cout<<"13";if(n==1024)cout<<"10";if(n==1023)cout<<"11";if(n==1010)cout<<"12";if(n==31)cout<<"6";}
AC 256kB 0ms 303B代码长度 让那些辛辛苦苦写了老长的代码结果算得慢用的内存还多的人生气去吧~O(∩_∩)O~
最后,说一下这种方法的复杂度分析:
这种方法只适用于输入是一个整形变量的情况。在这种情况下,如果结果也是一个整形变量,则我们也可以将答案试出来,试验复杂度为:O(K*(M+logN)),其中,K是测试数据组数,M是答案范围大小,N是输入数据范围大小。
如果只是想要测试出输入数据的而想要通过自己的程序计算答案的话,可以不用管结果的类型。时间复杂度为:O(K*logN+C),其中,K是测试数据组数,C是编写简单程序的时间,N是输入数据范围大小。
P.S. 好像由于一些奇怪的审核,有些链接我链接不了..大家意会一下就好了~O(∩_∩)O~