A. 足球锦标赛
Time limit per test: 2.0 seconds
Time limit all tests: 2.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 130 / 493
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
次。
思路:
把给出的总分分别加到甲方与乙方,算出分别需要翻动多少次,然后倒序相加。
for(i=1;i<=sum;i++)//对甲方进行操作
{
n++;
a[i]=a[i-1]+1;
if(n%10==0) a[i]+=9;
if(n%100==0) a[i]+=9;
//printf("%d ",a[i]);
}
对乙
for(i=1;i<=sum;i++)
{
m++;
b[i]=b[i-1]+1;
if(m%10==0) b[i]+=9;
if(m%100==0) b[i]+=9;
// printf("%d ",b[i]);
}
例如b[i]代表在给出的总分sum中 分出i给乙方。
最后把数组a与b相加输出最大值,需要注意的是A与B数组需要倒序相加,因为假如总共四分,给A4分,B就只有0分。
for(i=0,j=sum;i<=sum&&j>=0;i++,j--)
{
//printf("%d %d %d\n",a[i],b[j],a[i]+b[j]);
c[i]=a[i]+b[j];
if(c[i]>maxx) maxx=c[i];
}
代码如下:
#include<stdio.h>
#include<string.h>
int a[1000];
int b[1000];
int c[1000];
int main()
{
int N;
scanf("%d",&N);
int z=0;
while(N--)
{
z++;
int n,m,sum;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%d %d %d",&n,&m,&sum);
int i,j;
a[0]=0,b[0]=0;
for(i=1;i<=sum;i++)
{
n++;
a[i]=a[i-1]+1;
if(n%10==0) a[i]+=9;
if(n%100==0) a[i]+=9;
//printf("%d ",a[i]);
}
//printf("\n");
for(i=1;i<=sum;i++)
{
m++;
b[i]=b[i-1]+1;
if(m%10==0) b[i]+=9;
if(m%100==0) b[i]+=9;
// printf("%d ",b[i]);
}
int maxx=-1;
for(i=0,j=sum;i<=sum&&j>=0;i++,j--)
{
//printf("%d %d %d\n",a[i],b[j],a[i]+b[j]);
c[i]=a[i]+b[j];
if(c[i]>maxx) maxx=c[i];
}
printf("Case %d: ",z);
printf("%d\n",maxx);
}
return 0;
// printf("%d\n",999%100);
}