CF #347 (Div.2) C. International Olympiad(模拟)
2016-04-17 09:25
302 查看
题目链接:
CF #347 (Div.2) C. International Olympiad
题意:
给出一个年份的最短后缀表示,这个后缀表示可以唯一确定一个年份,年份从1989开始。输出这个年份。
例如:5,就代表1995,9就代表1989,2000就应该用00,因为0代表1990。
分析:
从后往前模拟,每一次向前模拟一步都可以唯一确定一个年份,然后判断这个年份是否已经由前
之前更短的后缀表示过了。并且确定的年份的后缀一定是贪心的当前后缀。
其实可以手算几个后缀就明白了。
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; }
相关文章推荐
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- 用javascript和css模拟select的脚本
- PHP模拟asp.net的StringBuilder类实现方法
- C#使用ImitateLogin模拟登录百度
- javascript用层模拟可移动的小窗口
- JS模拟简易滚动条效果代码(附demo源码)
- 自编jQuery插件实现模拟alert和confirm
- JS模拟按钮点击功能的方法
- PHP模拟asp中response类实现方法
- 模拟Spring的简单实现
- javascript 模拟点击广告
- JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
- php实现模拟post请求用法实例
- JavaScript实现MIPS乘法模拟的方法
- 模拟xcopy的函数
- JS模拟实现Select效果代码
- php模拟服务器实现autoindex效果的方法
- C# SendInput 模拟鼠标操作的实现方法
- PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
- js实现模拟银行卡账号输入显示效果