ACM题解报告——HD1008

  水题一道,废话不多说,直接贴代码

#include<stdio.h>
#include<string.h>
int main()
{
  int a[ 105],n;
  int sum,i,j;
  while( scanf( "%d",&n)&&n!=0)
{
  sum=0;
  memset( a,-1,sizeof( a));
  for( i=0;i<n;i++)
    scanf( "%d",&a[ i]);
  sum+=a[ 0]*6+5;
  for( i=0;i<n&&a[ i+1]!=-1;i++)
    {   j=a[ i+1]-a[ i];
  if(j>0 )
    sum+=j*6+5;
  else 
    sum+=( -j)*4+5;
 
 }
  printf( "%d\n",sum);
 }
  return 0;
}

第一次提交错误了,因为我把a数组初始化为0,在第二个for语句做判断的时候,判定条件为i<n&&a[n+1]!=0,导致电梯最后停在0层时候的sum值不对,后来改用了-1。

咦,怎么感觉我的代码字体大小不一样呢,好奇怪啊~

后来想了想,其实也可以不用数组实现的,加入一点动态规划的思想在里边,考虑到电梯停的两个不同楼层间关系,可以用一个整型begin记录每次的上一楼层,每停一次都要更新。

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 int main( )
 5 {
 6   int sum,i,n,b,begin;
 7   while( scanf( "%d",&n)&&n!=0)
 8 {
 9   begin=0;
10   sum=0;
11   for( i=0;i<n;i++)
12 {
13   scanf( "%d",&b);  
14   if( b>=begin)  
15   sum+=( b-begin)*6+5;
16   else
17     sum+=( begin-b)*4+5;
18   begin=b;
19  }
20   printf( "%d\n",sum);
21  }
22   return 0;
23 }

第二种实现方式代码会更简洁一些,个人比较倾向于第二种,一次AC。

原文地址:https://www.cnblogs.com/paradises/p/3052606.html