code jam round1 第一题

比赛链接,不知道能不能进
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

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值