Codeforces Round #555 (Div. 3)

A

读题没度清楚,搞了个checkset[0]在里面,做的时候循环一直有问题,检查好久才发现

#include <iostream>
#include <set>
using namespace std;
int checkset[10] = {0};
int main()
{
    int n;
    cin >> n;

    set<int> myset;
    myset.insert(n);
    n++;
    //cout << "go into loop now" << endl;
    while(1)
    {
        while(n % 10 == 0)
        {
            n /= 10;
        }
        myset.insert(n);

        //cout << "go into switch now" << endl;
        switch(n)
        {
            case 1 :
                checkset[1] = 1;
                break;
            case 2 :
                checkset[2] = 1;
                break;
            case 3 :
                checkset[3] = 1;
                break;
            case 4 :
                checkset[4] = 1;
                break;
            case 5 :
                checkset[5] = 1;
                break;
            case 6 :
                checkset[6] = 1;
                break;
            case 7 :
                checkset[7] = 1;
                break;
            case 8 :
                checkset[8] = 1;
                break;
            case 9 :
                checkset[9] = 1;
                break;
        }

        //cout << "go into check now" << endl;
        int checksum = 0;
        for(int i = 1; i < 10;i ++)
        {
            if(checkset[i] == 1)
                checksum++;
        }
        if(checksum == 9)
            {
                //cout << "get break" << endl;
                break;
            }

        n++;
    }

    //cout << "go print size now" << endl;
    cout << myset.size() << endl;
    return 0;
}

B

遇到了几个问题:

  • 字符串的替换(replace 头文件< string >)但是要注意第三个参数要么是char要么是string 不能直接用Int
  • 所以出现了第二个问题 int转string 使用itoa函数(头文件< cstdlib > )
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int numbermap[10] = {0}; // numbermap[1] - numbermap[9] 存储数字
int main()
{
    int n; // 存储读入数字的位置
    string number;

    cin >> n >> number;
    for(int i = 1; i < 10; i++)
    {
        cin >> numbermap[i]; //读入映射规则
    }

    for(int i = 0; i < n; i++)
    {
        int temp = number[i] - '0';
        if(temp < numbermap[temp])
            {
                char container[10];
                itoa(numbermap[temp], container, 10);

                number = number.replace(i, 1, container);
                // 用str替换指定字符串从起始位置pos开始长度为len的字符
                // string& replace (size_t pos, size_t len, const string& str);
            }
    }

    cout << number << endl;
    return 0;
}

放上去跑了一下WA了…… 因为有一个20000位的样例没过,以为是数字过大的问题,还很困惑string怎么会有这种情况。问了同学发现是我读题读的不对,原题的意思是选择连续子串进行处理且只处理一次。也就是说我们从高位看就行了,高位能换换完低位就不用再处理了。
另一方面关于字符串的替换,其实没必要那么复杂,直接s[i] = re[s[i]-‘0’] + '0’就可以了。
重新写一下。

#include <iostream>

using namespace std;
int numbermap[10] = {0}; // numbermap[1] - numbermap[9] 存储数字
int main()
{
    int n; // 存储读入数字的位数
    string number;

    cin >> n >> number;
    for(int i = 1; i < 10; i++)
    {
        cin >> numbermap[i]; //读入映射规则
    }

    int flag = 0; //记录有无进行过映射

    for(int i = 0; i < n; i++)
    {
        int temp = number[i] - '0'; //不映射的数字

        if(temp < numbermap[temp])//不映射数字小于映射数字
        {
            number[i] = numbermap[temp] + '0';
            flag = 1; //已进行过一次映射
        }

        if(flag && temp > numbermap[temp]) //已经映射过且此处不必映射(因为是连续子串,一旦停止就不可以继续往后看了)
            //这里不可以取等于!!
            //因为可能这里等于 替不替换都可以 但是会影响到下一位!!
            //本来如果选择替换后面就是连续子串可以继续换下去使得结果更大 
            //但是一旦break就没法继续了会比答案小!
            break;
    }

    cout << number << endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值