[模拟]ZOJ3485 Identification Number
题意:给了一串15位或18位的身份证号码,求 在改变最少位数的情况下, 输出正确合法的身份证号
合法的身份证 是按照以下规则:

前6位以及“Order code”三位 一定合法
其中X是根据前17位的值计算出来的 按照如下公式 (a1就是最后一位,若为10就是X)

另外 题目还规定了“Date of Birth” 要在1900.1.1到2011.4.2之间
刚开始想这题的时候,觉得15位也就只需要 改变 年月日6位
18位也就只需要 改变 年月日加X位9位而已
但是打起来发现并非这么简单。。。
单单是改变年月日就还需要考虑每月有多少天、需要考虑是否为闰年、需要考虑是否超过1900.1.1到2011.4.2的范围...
对于18位的,改变了前面 还有影响到X的
这样打下来相当之麻烦... 而且很容易错
因此不能采用这种方法
我们来换一种思路:
假设, 我们已经知道了 “在改变最少位数之后的身份证号码” 那么来计算与输入的有几位不一样,那是一件很方便的事
那么如何来得到 “在改变最少位数之后的身份证号码” 呢?
我们只需要遍历1900.1.1到2011.4.1之间的每一天 (这样想之后, 发现给了一个范围真好啊!!)
比较每一天与输入的需要改变几位,记录最小的 改变的位数 的那一天就好了
string s;
int run[][]={{, , , , , , , , , , , },
{, , , , , , , , , , , }}; int w[]={, , , , , , , , , , , , , , , , , };
int a[], b[];
int ans[];
void copy(int y, int m, int d)
{
for(int i=; i<s.length(); i++)
b[i]=a[i];
if(s.length()==)
{
b[]=y%/, b[]=y%%;
b[]=m/, b[]=m%;
b[]=d/, b[]=d%;
}
else
{
b[]=y/, b[]=y/%, b[]=y%/, b[]=y%%;
b[]=m/, b[]=m%;
b[]=d/, b[]=d%;
}
}
int y, m, d;
bool cao()
{
if(y== && m== && d==)
return true;
int Y=y, M=m, D=d+;
if(run[((Y%== && Y%) || Y%==)][M-]+==D)
M++, D=;
if(M==)
Y++, M=;
copy(Y, M, D);
y=Y, m=M, d=D;
return false;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
cin>>s;
for(int i=;i<s.length();i++)
a[i]=(s[i]=='X'? :s[i]-'');
y=, m=, d=;
int minn=;
copy(y, m, d);
while(true)
{
int num=;
if(s.length()==)
{
int sum=;
for(int i=; i<; i++)
sum+=b[i]*w[i];
b[]=(-sum%)%;
}
for(int i=; i<s.length(); i++)
if(b[i]!=a[i])
num++;
if(num<minn)
{
for(int i=; i<s.length(); i++)
ans[i]=b[i];
minn=num;
}
if(cao())
break;
}
for(int i=; i<s.length(); i++)
{
if(ans[i]!=)
printf("%d", ans[i]);
else
putchar('X');
}
puts("");
}
return ;
}
ZOJ 3485
[模拟]ZOJ3485 Identification Number的更多相关文章
- 银行卡BIN: Bank Identification Number
What is a 'Bank Identification Number - BIN'A bank identification number (BIN) is the initial four t ...
- 模拟T1数字number
那么第一题首先非常水的一道题…… 看一下题 数字(number) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK拥有n个数,这n个数分别是a1,a2,… ...
- 20180523模拟赛T4——Number
[题目描述] 最近
- 210 - Concurrency Simulator(WF1991, deque, 模拟)
题目有点长,理解题花了不少时间 粘下别人的翻译~ 你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行.每个程序包含不超过25条语句,格式一共有5种: var=constant(赋值): pri ...
- Cookies Client Identification
HTTP The Definitive Guide Cookies are the best current way to identify users and allow persistent se ...
- Fat URLs Client Identification
w在每个URL后面都附加一个用户特有的标识码. HTTP The Definitive Guide Some web sites keep track of user identity by gene ...
- RFID 基础/分类/编码/调制/传输
不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...
- 左右v$datafile和v$tempfile中间file#
v$datafile关于存储在文件中的数据视图的信息,v$tempfile查看存储在一个临时文件中的信息. 有两种观点file#现场,首先来看看官方文件的定义: V$DATAFILE This vie ...
- 深入javascript之对象
前言 这是读书笔记第二篇,看完之后突然发现自己对js的内置的一些东西还是了解的不够全面,很多方法见都没见过,啥用都不知道,这是非常不可取的.码农好歹也得眼熟啊,晓都不晓得后面的学习还怎么进行下去... ...
随机推荐
- js 验证电话号 座机及手机号
function CheckTel() { /*验证电话号码 验证规则:区号+号码,区号以0开头,3位或4位号码由7位或8位数字组成 区号与号码之间可以无连接符,也可以“-”连接 如010888888 ...
- C# 3.0 特性之扩展方法
今天,我们来聊一聊C#的扩展方法. C# 3.0中为我们提供了一个新的特性—扩展方法.什么是扩展方法呢?我们看一下MSDN的注解: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新 ...
- NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与 ...
- javascript笔记——jQuery插件开发的几种方式
jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.e ...
- C# 代理HTTP请求
目的: 应该有不少人需要去某些网站不停爬取数据,有时会使用HTTPRequest一直请求某个网站的某个网址.有的网站比如 QQ空间,赶集网(这是我测试的网站),不停刷新会提醒你的账号异常,可能会查封你 ...
- C#定时器
在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 S ...
- php数组去重实例及分析
php数组去重实例及分析. 一维数组的重复项: 使用array_unique函数即可,使用实例 <?php $aa=array("apple","banan ...
- javascript获取ckeditor编辑器的值(实现代码)
CKeditor编辑器是FCKeditor的升级版本想对于FCK来说,确实比较好用,加载速度也比较快以下是如果通过JS获取CKeditor编辑器的值,用于表单验证 if(CKEDITOR.instan ...
- Oracle回收站
回收站是删除对象使用的存储空间.可以使用实例参数recyclebin禁用回收站,默认是on,可以为某个会话或系统设置为off或on.所有模式都有一个回收站. 当表空间不足时可以自动重用回收站对象占用的 ...
- 如何应用CLR线程池来管理多线程
class Program { static void Main(string[] args) { int intWorkerT ...