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。