拨算盘
Description
对数字敏感的豆豆顺利进入了学校的珠算兴趣小组,老师送了他们每人一个算盘,但好玩的算盘并不是那么容易上手的,有很多小朋友因为嫌累纷纷退出了该兴趣小组,豆豆觉得 人都走光了就太冷清了,于是决定说服小朋友们留下来,他把加法算式所需要的拨动次数算 了出来,发现其实拨动次数没有想象的那么多。现在给你一系列加数(正整数),请计算使用算盘求解时需要拨动几次,(算盘图如下, 当前表示 67)。
算盘被中间的横档分为上下半区,上方只有 1 颗表示该位上的 5,靠近中间的横档就计 数 5,只要拨动它就累计一次拨动,下方的四颗每颗表示 1,靠近横档就计相应个数的 1, 下方需要拨动多颗可以合并为一次拨动。
注意:珠算里面的手法习惯是高位先算(这迎合了我们读数字的习惯) 例如 37+31,拨动方法如下图:
所以37+31总共需要拨动6次。
Input
第一行一个整数 N(1<=N<=10000), 表示加数的个数。
接下来N行,每行一个正整数,表示加数Ai(1<=Ai<2^31)。
Output
一个整数表示需要的拨动次数(假设算盘的位数足够多)。
Sample Input
2
853
947
Sample Output
11
Hint
30%的数据保证每个加数是100以内的,N<=10。
60%的数据保证加数和小于2^31, N<=100。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 21
int he[N],js[N];
int yw(int x,int y);
int main()
{
int n,i,j,k,ans,x,x1,x2,ws;
long long temp;
bool bj;
scanf("%d",&n);
ans=0;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
temp=x;
ws=0;
while(temp!=0)
{
js[++ws]=temp%10;
temp/=10;
}
for(j=ws;j>=1;j--)
{
x1=he[j]+js[j];
if(x1>=10)
{
x1-=10;
bj=true;
k=j+1;
while(bj)
{
x2=he[k]+1;
if(x2>=10)
{
x2-=10;
}
else
{
bj=false;
}
ans+=yw(he[k],x2);
he[k]=x2;
k++;
}
}
ans+=yw(he[j],x1);
he[j]=x1;
}
}
printf("%d\n",ans);
return 0;
}
int yw(int x,int y)
{
int z;
if((x<=4&&y<=4)||(x>4&&y>4))
{
return x!=y?1:0;
}
if(x>y)
{
swap(x,y);
}
z=1;
z+=(x!=(y-5)?1:0);
return z;
}