HDOJ学习笔记(二)

来源:互联网 发布:淘宝女购物车 猝死男友 编辑:程序博客网 时间:2024/04/28 07:47
原创文章,版权归www.encalyk.com所有,转载请注明。 

第二阶段:由于刚接触C++,所以训练一些不需要高深算法的题目,巩固C++语言。
训练如下题型:1008、1108(辗转相除法)、1061、2035(提示:解法一:改进后的暴力。解法二:二分加速)、1021、1205、1071。
训练心得及感想:
1061:很扯淡的用了SWITCH,然后很扯淡的分成3块来计算,到后来才发现N=N%4一条语句就能把N=N%2,N=N%1一起归纳了。N=N%4+4;这个+4算亮点了吧,省去了IF(0==N)。
2035:尝试了次最暴力的解法,很自然的就溢出了。改进后的暴力思路如下:一个大于10000的数乘以一个大于1的整数,无论这个正整数是什么,其结果一定大于10000。即a>10000,d>0…a=b*10000+c…a*d=(b*10000+c)*d=b*10000*d+c*d。当你取最后三位时,前面大于10000的就会自动舍去了,所以只需取模应算。二分加速指的是,如N的100次方可以看成N的50次方的平方,这样就从99次乘法降为50次乘法了。于是乎,作为ACM新手的我很华丽的跳过了,以后再回来实现这个解法吧。
1021:很快的就把算法写出来了,结果RE了。发现一般数据大的题都有规律可循。经过几次删减AC答案原来可以很短,哭笑不得。
1205:之前做一直WA,后来才发现SUM会溢出,要用DOUBLE。
1071:简单的积分问题,主要是熟悉iomanip的应用,还有一种回到高中的感觉,怀念ing。
总结:第二阶段训练的时间很短,从女友家回来没几天,就被父母拉去逛亲戚家。才静下心来训练几天,明天又要去女友家了。不过去拔花生体验一下也是很快乐的。ACM总算入门了,这个假期有ACM有女友,足矣~下阶段打算把算法导论和C++ PRIMER看一部分,然后应该就迎接开学了。

本人的C++版AC解法:
1008
#include <iostream>
using namespace std;
int main()
{
 int N,a[100],i,sum,b;
 while((cin >> N ) && (N!=0) && (N<=100))
 {
  sum=0;
  for(i=0;i<N;i++)
  {
   cin >> a[i];
   if (0==i) sum+=a[i]*6;
   if (i>0)
   {
    b=a[i]-a[i-1];
    if (b>0) sum+=(a[i]-a[i-1])*6;
    if (b<0) sum+=(a[i]-a[i-1])*-4;
   }
  }
  sum+=N*5;
  cout << sum << endl;
 }
 return 0;
}

1108
#include <iostream>
using namespace std;
int main()
{
 int gyx(int x,int y);
 int a,b,y,gbs;
 while(cin >> a >> b)
 {
  if ((a<0)||(a>1000)||(b<0)||(b>1000))
   return 0;
  else
  {
   y=gyx(a>b?a:b,a<b?a:b);
   gbs=a*b/y;
  }
  cout << gbs << endl;
 }
 return 0;
}
int gyx(int m,int n)
{
 int  p;
 while(0!=p)
 {
  p=m%n;
  m=n;
  n=p;
 }
 return m;
}

1061
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 int T,N,g,result;
 cin >> T;
 while(T–)
 {
  cin >> N;
  g=N;
  N=N%4+4;
  result=pow(g,N);
  cout << result << endl;
 }
 return 0;
}

2035
#include <iostream>
using namespace std;
int main()
{
 int A,B,R;
 while((cin >> A >> B)&&((A!=0)||(B!=0)))
 {
  for(R=1;B>0;B–)
  {
   R*=A;
   R=R00;
  }
  cout << R << endl;
 }
 return 0;
}

1021
#include <iostream>
using namespace std;
int main()
{
 int a;
 while((cin >> a) && (a<1000000))
  cout << (2==a%4?”yes”:”no”) << endl;
 return 0;
}

1205
#include <iostream>
using namespace std;
int main()
{
 int T,Mi,N,max,i;
 double sum;
 cin >> T;
 while(T–)
 {
  sum=0;
  max=0;
  cin >> N;
  for(i=0;i<N;i++)
  {
   cin >> Mi;
   max=max>Mi?max:Mi;
   sum+=Mi;
  }
  cout << ((2*max-sum>1)?”No”:”Yes”) << endl ;
 }
}

1071
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
 int T;
 double x1,x2,x3,y1,y2,y3;
 double a,b,c,h,k,area=0;
 cout.setf(ios::fixed);
 cout.setf(ios::showpoint);
 cout.precision(2);
 cin >> T;
 while(T–)
 {
  cin >>x1>>y1>>x2>>y2>>x3>>y3;
  a=(y2-y1)/((x2-x1)*(x2-x1));
  b=-2*a*x1;
  c=y1-a*x1*x1-b*x1;
  k=(y3-y2)/(x3-x2);
  h=y2-k*x2;
  area=a/3*(x3*x3*x3-x2*x2*x2)+(b-k)/2*(x3*x3-x2*x2)+(c-h)*(x3-x2);
  cout << area << endl ;
 }
}

原创粉丝点击