zoj 1033 与其说是搜索,不如说是枚举
zoj 与其说是搜索,不如说是枚举,只不过是通过搜索来实现的罢了。
主要是要注意好闰年的判断,特别是要注意好一串数字的划分。
题意其实我也看了一个晚上,才渐渐的看懂。
题意:
给你一个字符串,其中包含数字信息,年月日,如果还有数字意外的字符,那么就一定有两个字符,将年月日三中信息隔开
如果里面没有其他字符,那么就只有数字,其中分配给月,日每个需要两个数字字符,而分配给年则需要2,4个字符来表示
将限制条件写好,自然也就ac了。过程可能不好受,但是都是这么过来的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
using std::cin;
using std::cout;
using std::endl;
using std::set;
set<int> ans;
int const N = ;
int month[]={,,,,,,,,,,,,};
int Date;
char tmp[N];
bool Isleap(int y)
{
return (y%==&&y%==)||(y%==&&y%!=);
}
int md(int y,int m)
{
return (m==&&Isleap(y))?month[m]+:month[m];
}
bool ymd(int y,int m,int d)
{
return (y>=&&y<=&&m>=&&m<=&&d>=&&d<=md(y,m));
}
int cal_date(int y,int m,int d)
{
int cnt=;
for(int i = ; i < y; i++)
if(Isleap(i))cnt += ;
else cnt += ;
for (int i = ; i < m; i++)
cnt+= md(y,i);
cnt = cnt + d;
return cnt;
}
bool Containf(int len)
{
for(int i=;i<len;i++)
if(tmp[i]<''||tmp[i]>'')
return true;
return false;
}
void example(int y,int m,int d,int a,int b,int c)
{
if(b<=&&c<=)
{
if(a<=)
for(int i=;i<=;i+=)
{
if(ymd(i+y,m,d))
{
int cnt=cal_date(y+i,m,d);
cnt=cnt-Date;
ans.insert(cnt);
}
}
if(a==)
{
if(ymd(y,m,d))
{
int cnt=cal_date(y,m,d);
cnt=cnt-Date;
ans.insert(cnt);
}
}
}
}
void function(int y,int m,int d,int a,int b,int c)
{
example(y,m,d,a,b,c);
example(y,d,m,a,c,b);
example(m,y,d,b,a,c);
example(m,d,y,b,c,a);
example(d,y,m,c,a,b);
example(d,m,y,c,b,a);
}
int main()
{
int T,len,y,m,d,Case=;
Date=cal_date(,,);
cin>>T;
while(T--)
{
ans.clear();
cin>>tmp;
len=strlen(tmp);
y=m=d=;
if(Containf(len))
{
int i=,a=,b=,c=;
for(;tmp[i]<=''&&tmp[i]>='';i++)y=y*+tmp[i]-'',a++;
i++;
for(;tmp[i]<=''&&tmp[i]>='';i++)m=m*+tmp[i]-'',b++;
i++;
for(;i<len;i++)d=d*+tmp[i]-'',c++;
function(y,m,d,a,b,c);
}
else
{
for(int i=;i<len-;i++)
{
for(int j=i+;j<len;j++)
{
y=m=d=;
for(int k=;k<i;k++)y=y*+tmp[k]-'';
for(int k=i;k<j;k++)m=m*+tmp[k]-'';
for(int k=j;k<len;k++)d=d*+tmp[k]-'';
function(y,m,d,i,j-i,len-j);
}
}
}
printf("Scenario #%d:\n",++Case);
if(ans.empty())
{
cout<< "Illegal date"<<endl<<endl;
continue;
}
set<int>::iterator rit;
for(rit=ans.begin();rit!=ans.end();rit++)
cout<<*rit<<endl;
cout<<endl;
}
return ;
}
zoj 1033 与其说是搜索,不如说是枚举的更多相关文章
- HDU 4430 & ZOJ 3665 Yukari's Birthday(二分法+枚举)
主题链接: HDU:pid=4430" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=4430 ...
- [ZOJ 1011] NTA (dfs搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011 题目大意:在一棵树上,给你起始状态,问你能否到达终止状态. ...
- POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)
题意:给定n个只有大写字母组成的字符串,选取尽可能多的字符串,使得这些字符串中每个字母的个数都是偶数.n<=24 思路:直接枚举每个字符串的选或不选,复杂度是O(2^n).其实还有更简便的方法. ...
- ZOJ 1492 Maximum Clique 搜索最大团
ZOJ1492 题意:给一个无向图 求最大团的大小.节点数小于50 数据有限,考虑记忆化搜索,方程很好给出. 令 Si={vi,vi+1.....vn} mc[i]表示Si最大团的大小,倒着推算. 必 ...
- zoj 3644 记忆化搜索
题目:给出一个有向图,从1到n,每个结点有个权值,每走一步,分值为结点权值的LCM,而且每一步的LCM都要有变化,问到达N的时候分值恰好为K的路径有多少条 记忆化搜索,虽然做过很多了,但是一直比较慢, ...
- 【搜索】POJ-3187 枚举全排列
一.题目 Description FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to ...
- DSL 或者说是抽象 或者说是沉淀 ,我看到的不错的一篇文章
作者:张浩斌 链接:https://www.zhihu.com/question/45552115/answer/99388265 来源:知乎 著作权归作者张浩斌和知乎所有. ---------- ...
- 浙江大学2015年校赛F题 ZOJ 3865 Superbot BFS 搜索
不知道为什么比赛的时候一直想着用DFS 来写 一直想剪枝结果还是TLE = = 这题数据量不大,又是问最优解,那么一般来说是用 BFS 来写 int commandi[4] = {1, 2, 3, 4 ...
- ZOJ - 1539 记忆化搜索
注意不要仅搜DP(1e7),因为这不是线性的 #include<iostream> #include<algorithm> #include<cstdio> #in ...
随机推荐
- 双人五子棋对战(需要EasyX图像库)
实训要做项目呐.天天坐在电脑面前累死了.最近题刷的少.大多数都挺水.就不挨个编辑发上来了.发发白天写的项目吧.可能好几天更一下.实训结束恢复正常. 这个游戏需要EasyX的图像库.有兴趣的可以下一个图 ...
- 每天一个linux命令(1):more命令
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- linux下面的查找
locate: 速度快 不是实时的,每天定时执行把结果导入数据库 模糊匹配 updatedb --手动生成文件数据库,执行时间较长 find: 实时查找 ...
- Javascript 中 null、NaN和undefined的区别
1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码 var a1; var a2 = tr ...
- jQuery Ajax无刷新操作
下面是“无刷新登录”的例子,采用Ashx+jQuery Ajax实现. //后台实例代码 ashx文件(可替换为从数据库中读取) public void ProcessRequest(HttpCont ...
- twisted internet.reactor部分 源码分析
twisted.internet.reactor 是进行所有twisted事件循环的地方. reactor在1个python进程中只能有一个. 在windows下用的是select.linux下epo ...
- 基于Emgu CV 的手势识别实现PPT的控制放映
Emgu CV 简介 众所周知,Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV.开发者可以很方便的通过C#,VB等语言调用OpenCV函数 ...
- Hbase实例
import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.had ...
- 微信开发之开发环境搭建( visual studio 2015we + IIS express + ngrok)
1. 申请个人测试使用的微信订阅号 https://mp.weixin.qq.com 可注册微信订阅号. 不会?请自行百度. 2. 安装 ngrok 微信开发首先要解决如何让微信链接到本地开发环境.有 ...
- Linux安装包
关于SWT SWT首先要在Eclipse中添加SWT的安装包:Windowsbuilder Pro.下载路径:http://www.eclipse.org/windowbuilder/download ...