第一次AC(20090115)【题解经验】【原创备份】

第一次AC(20090115)【题解经验】

今天第一次submit了ACM题目,第一次AC。遂作一文,以作纪念。
本文没什么技术含量,只是纪念一下我的第一次AC。
昨晚至今天凌晨,我做了POJ1003和POJ1006两道题目。其中POJ1003用了十几分钟,POJ1006用了大概半小时吧。到了今天早上,我把题解拿到POJ来Judge一下。然后AC了。对于一个刚刚入门的我而言,很是满意了。
下面说一下题目。大家不必参考,因为我的方法并非最优解法,而是我最快想到的解法。
 
POJ1003:
题目背景就懒得讲了。题目的意思是给一个范围从0.01到5.20的数你,这个数可以用1/2 + 1/3 + 1/4 + ... + 1/(n + 1) 表示,让你算出n的值。
我首先想到了暴力验算法,AC的运行时间为0MS。以下是程序代码。
 

//Start:20090114

//Finish:20090114
//AC:20090115 POJ 264K 0MS
//Welkin

#include <iostream>

using namespace std;

int main()
{
 double m,t,res;
 cin >>m;
 while(m!=0.00)
 {
  for(t=2,res=0;m-res>0.0001;t++)//0.001为临界值
  {
   res=res+1/t;
  }//for
  cout <<t-2<<" card(s)"<<endl;
  cin >>m;
 }
 return 0;
}
  

POJ1006:

随便讲一下背景。假设人体有physical,emotional,和intellectual三个循环,循环周期分别是23天、28天和33天。现在给出physical,emotional,和intellectual的到达峰值的经过天数p、e和i,以及当前经过的天数d。让你算出physical,emotional,和intellectual共同达到峰值天数是几天以后。其中的可能比p、e、i小;p、e、i可能比它们的周期的数值大,范围在0到365。而结果范围是1到21252。
我的思路是,先分别为p、e、i算出自开始计时以来,最近的峰值天数。然后取p值开始递增,每次验算一下是否三者同时到达峰值。如果是,则记录为res,然后用res减去d。最后,判断res是否在结果范围,不在则加上21252即可,因为res只会是小等于0。
这种方法也是暴力验算法,技术含量为0。所以我的题解的运行时间为776MS。不管怎么说,也还是AC了。

//Start:20090114

//Finish:20090115
//AC:20090115 POJ 264K 766MS
//Welkin

#include <iostream>

using namespace std;

int main()

{
 int p,e,i,d,res,j=0;
 const int P=23,E=28,I=33;
 cin >>p>>e>>i>>d;
 while (p != -1)
 {
  while(p>=P)
  {
   p-=P;
  }
  while(e>=E)
  {
   e-=E;
  }
  while(i>=I)
  {
   i-=I;
  }
  res=p;
  while(!( ((res-p)%P==0) && ((res-e)%E==0) && ((res-i)%I==0) ))
  {
   res++;
  }
  res-=d;
  while(res <=0)
  {
   res+=21252;
  }
  cout <<"Case "<<++j<<": the next triple peak occurs in "<<res<<" days."<<endl;
  cin >>p>>e>>i>>d;
 }
 return 0;
}

 

最后,希望大家加油啊!天天AC天天好心情,呵呵o(∩_∩)o...

Leave a comment