CF #347 (Div.2) C. International Olympiad(模拟)

题目链接:
CF #347 (Div.2) C. International Olympiad
题意:
给出一个年份的最短后缀表示,这个后缀表示可以唯一确定一个年份,年份从1989开始。输出这个年份。
例如:5,就代表1995,9就代表1989,2000就应该用00,因为0代表1990。
分析:
从后往前模拟,每一次向前模拟一步都可以唯一确定一个年份,然后判断这个年份是否已经由前
之前更短的后缀表示过了。并且确定的年份的后缀一定是贪心的当前后缀。
其实可以手算几个后缀就明白了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;

int T;
char s[15];
int vis[15];

int year[15]={1990,1991,1992,1993,1994,1995,1996,1997,1998,1989};

int main()
{
    //freopen("Cin.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%s",&s);
        int len=strlen(s);
        int base=s[len-1]-'0';
        int total=0,index=1,extra=0,cur;
        for(int i=len-1;s[i]>='0'&&s[i]<='9';i--){
            extra+=(s[i]-'0')*index;
            index*=10;
            int pre=year[base]/index-1;
            int flag=1;
            while(flag){
                pre++;//年份前缀+1
                cur=pre*index+extra; //cur是当前的年份
                if(cur<year[base]) continue; //需要判断贪心得到的年份是不是太小了,例如确定后缀为15的年份时
                flag=0;
                for(int j=0;j<total;j++){ //检查年份是否已经被用过
                    if(vis[j]==cur){ //已经被用过了
                        flag=1;
                        break;
                    }
                }
            }
            vis[total++]=cur;
        }
        printf("%d\n",vis[total-1]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值