足球锦标赛
Time limit per test: 2.0 seconds
Time limit all tests: 2.0 seconds
Memory limit: 256 megabytes
ECNU 足球锦标赛采用了最传统的计分牌来计分。每进一个球,计分员给对应的队要翻牌,使得计分板上显示的数加一。
如上图所示,计分板上的每一位都按顺序挂了
0
到
9
这
10
个牌子,所以可以表示
000
至
999
。当其中一个队的得分从
010
变成
011
时,计分员只要将最后一位的最前面的牌子向后翻即可,共需翻动一块牌子;当得分从
019
变成
020
是,由于
9
后面已经没有牌子了,所以计分员要将
0
到
9
全部翻到前面,并将倒数第二位的牌子
1
翻到后面,所以共需翻动
10
块牌子。
现场的计分牌和图中所示还是存在差异的,现场的计分牌会很大,很重,所以翻每块牌子都要消耗
1
点体力。
你是计分员,现在比赛还剩下最后十分钟。现在有一个预言家告诉你在这十分钟里,双方得分共计多少;但他没有告诉你双方得分各是多少。所以你想要知道你要花费的体力值最多是多少。
Input
第一行给出数据组数
T
(1≤T≤1 000)
。接下来对于每组数据有两行:
第一行是两个三位数
A,B
(0≤A,B≤999)
(含前导 0),形如
001
,
013
,
123
,表示双方现在的得分。
第二行是一个整数
K
(0≤K≤min{999−A,999−B})
,表示双方在最后十分钟的得分之和。
Output
对于每组数据,输出 Case x: y
。其中 x 是从 1 开始的测试数据编号,y 是一个整数,表示花费体力最多是多少。
Examples
2 009 009 2 001 003 2
Case 1: 20 Case 2: 2
Note
样例 1 解释:有三种情况。
- 甲方(前者)得
2
分,乙方(后者)得 0
分;甲方要翻 10+1=11
次。
- 甲方和乙方各得
1
分,共要翻 10+10=20
次。
- 乙方得
2
分,同样翻 11
次。
所以最多要翻
20
次。
思路: 模拟加暴力
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int A(string s,int x)
{
int sum=0;
while(x>0)
{
while(x>0&&s[2]<'9')
{
s[2]++;
x--;
sum++;
}
if(x>0&&s[2]=='9'&&s[1]!='9')
{
sum+=10;
x--;
s[2]='0';
s[1]++;
}
if(x>0&&s[2]=='9'&&s[1]=='9')
{
sum+=19;
x--;
s[2]='0';
s[1]='0';
s[0]++;
}
}
return sum;
}
int main()
{
int n,a,ans,cas=1;
string s1,s2;
scanf("%d",&n);
while(n--)
{
ans=-1;
cin>>s1>>s2;
scanf("%d",&a);
for(int i=0;i<=a;i++)
{
int x=i;
int y=a-i;
ans=max(ans,A(s1,x)+A(s2,y));
}
printf("Case %d: %d\n",cas++,ans);
}
return 0;
}