sdut3914(简单暴力)

校赛~校赛~
Time Limit: 1000 ms / Memory Limit: 65536 kb
Description
SDUT 的校赛是从 2009 年开始的,康纳每年看到比赛之后,往往就会喊一声 “ma ji ya ba ku nai + 年份的缩写”。比如说 2009 年就会说 “ma ji ya ba ku nai 9”。年份的缩写是一个字符串形式的,但是如果当前选择的字符串以前已经被用过,就会再向前继续取,比如说 2019 年的话康纳一开始会选择 9 但是 9 已经被用过了,所以就会向前多加一位缩写为 19,于是就会说 “ma ji ya ba ku nai 19”,2100 年的话 0 被使用过了康纳就会说 “ma ji ya ba ku nai 00”。2119 年的话 9, 19 都被使用过了,所以缩写便是 119。于是就会说 “ma ji ya ba ku nai 119”。然后现在告诉你康纳喊的话的内容,你需要告诉康纳现在是哪一年的校赛。

看她这么萌~你还不赶快告诉她么~

Input
输入数据有多组(数据组数不超过 3),到 EOF 结束。

对于每组数据:

首先输入一行 n (1 <= n <= 100000),表示康纳喊话的次数
接下来 n 行,每行一个字符串,代表康纳喊话的内容。保证其中缩写的年份的字符串内容长度不超过 9
Output
对于每组输入,输出 n 行,每行输出一个整数表示康纳喊话中年份缩写所代表的具体年份。

Sample Input
5
ma ji ya ba ku nai 9
ma ji ya ba ku nai 19
ma ji ya ba ku nai 99
ma ji ya ba ku nai 00
ma ji ya ba ku nai 2017
Sample Output
2009
2019
2099
2100
12017

有题解是O(1)复杂度,找出规律了,刚开始做的时候,也想是用if判断写,没有打表来找,只是用头想一下,太烦乱了,其实个位,十位……一个一个判断加相应的值

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        string s;
        int num;
        getchar();
        for(int i = 0;i < t;++i)
        {
            getline(cin,s);
            int len = s.size();
            //cout << len << endl;
            string x = s.substr(19,len - 17);
            int Size = x.size();
            int num = x[Size - 1] - '0';
            if(num == 9){
                num = 2009;
            }
            else{
                num = 2010 + num;
            }
            for(int i = Size -2;i >= 0;--i)
            {
                string y = x.substr(i,Size - i);
                int k;
                sscanf(y.c_str(),"%d",&k);
                int ans = floor(pow(10,Size - i - 1));
                bool flag = false;//立flag的目的是必须进入循环一次
                //printf("%d %d\n",k,ans);
                while(num % (ans * 10) != k || !flag)
                {
                    num += ans;
                    flag = true;
                }
                //printf("%d\n",num);
            }
            printf("%d\n",num);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值