比赛链接,不知道能不能进
debug一天
举例子 ------> debug -----> 不断完善…
贪心+模拟
#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int _;
string s[1009];
void work()
{
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> s[i];
int sum = 0;
for(int i = 2; i <= n; ++i)
{
string a = s[i-1], b = s[i];
if(a.length() > b.length())
{
int tmp = a.length() - b.length();
bool f = 0;
for(int j = 0; j < b.length(); ++j)
{
if(a[j] > b[j])// 判断b 和 a前边与b等长的序列,是b大还是a大
{ // 若 a 大, 直接构造 tmp + 1长度的0
// 若b大,就构造 tmp 长度的 0 就可以了
// 若b是a的前缀,那么就...继续讨论
f=1;
break;
}
else if(a[j] < b[j]) break;
}
if(f)// a大
{
for(int j = 1; j <= tmp + 1; ++j)
b += "0";
s[i] = b;
sum += tmp + 1;
}
else// b大 或者 b是不是a的前缀
{
bool fl=1;
for(int j = 0; j < b.length(); ++j)// 判断b是不是a的前缀
if(a[j] != b[j]) fl=0;
if(!fl)// b大
{
for(int j = 1; j <= tmp; ++j)
b += "0";
s[i] = b;
sum += tmp;
}
else
{
int j = a.length() - 1;
while(a[j] == '9' && j >= b.length())// 倒着求出a字符串中第一个不是9的下标,但要注意界限,不能到b
// 这个地方之前写的 j>=1 一直wa, 改了一万年才对,吐了,太菜了
--j;// j 代表的是a的下标,
/* 1 让我发现最后一个bug的例子 纪念一下...
2
123456999 1234569 */
if(j == b.length() - 1)
{// 虽然b是a的前缀,但是a之后的全是9,那就只能构造 tmp + 1 个0了
for(int j = 1; j <= tmp+1; ++j)
b += "0";
s[i] = b;
sum += tmp+1;
continue;// 注意构造完了不用向下执行了
}
for(int k = b.length(); k < j; ++k)
{// k起始点b结束的下一个
b += a[k];
}
b += (a[j]-'0'+1) + '0';//
for(int k = 1; k <= a.length() - 1 - j; ++k)
b += "0";
s[i] = b;
sum += tmp;
}
}
}
else if(a.length() == b.length())
{
if(a >= b)
{
b += "0";
sum++;
}
s[i] = b;
}
}
/*for(int i = 1; i <= n; ++i)
cout << s[i] << endl;*/
printf("Case #%d: %d\n", ++_, sum);
}
int main()
{
cin >> t;
while(t--)
work();
/*string a = "1234", b = "234";
bool f = a > b;
cout << a - b << endl;*/
return 0;
}
/*
1
3
12239 1223 122
2
12345999 1234
123455990
123456 1234
123499 123 111
12348 12349 1234
2
2
111149 4567
2
111199 4567
3
4 129 1
3
2
12345 122
2
12345 123
2
12399 123
1
3
1299 12 1
1
2
123456999 1234569
*/