牛客多校第六场 G Is Today Friday? 蔡勒公式/排列
题意:
有一堆日期,这些日期都是星期五,但是数字被映射成了字母A~J,现在让你求逆映射,如果存在多种答案,输出字典序最小的那个。
题解:
用蔡勒公式解决关于星期几的问题。
对于映射,可以用笔者刚刚学会的神器,next_permutation(),直接按照字典序生成排列数作为映射,一旦找到解,就输出,必定是字典序最小的。
理论上,枚举10个排列数需要枚举10!≈3e6次,生成下一个排列复杂度为O(n),每次枚举还要检查1e5个日期。
但是一旦找到合法的映射便可直接输出,而不合法的映射往往在检查前几个日期时就被检查出不合法,因此剪枝效果还是很好的。
注意要对于日期去重,对于去重来说unique()是个神器,能直接在排好序的数组上将重复元素只保留一个,然后返回去重之后的数组的最后一位的后一位的地址。参数也是类似于sort()
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string date[];
char tmp[];
//char week[10000][13][32];
int refl[];
inline bool Leap(int year){
if(year%==||(year%== && year%!=))return ;
else return ;
}
inline bool days31(int month){
return (month== || month== || month== || month== || month== || month== || month==);
}
inline bool Zeller(int year,int month,int day){
if(year<)return ;
if(month== || month >=)return ;
if(day<=)return ;
if(month==){
if(Leap(year)){
if(day>)return ;
}else{
if(day>)return ;
}
}
if(days31(month)){
if(day>)return ;
}else{
if(day>)return ;
}
//判断日期合法性
if (month == || month == ){
year--;month += ;
}
//判断month是否为1或2
int c = year / ;
int y = year - c * ;
int week = y + y / + c / - * c + * (month + ) / + day - ;
week%=;
week+=;
week%=;
return (week==);
}
int main(){
int T;
scanf("%d",&T);
for(int I=;I<=T;I++){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",tmp);
// 0000/00/00
tmp[]=;
tmp[]=;
date[i].clear();
date[i]+=tmp;
date[i]+=tmp+;
date[i]+=tmp+;
}
sort(date+,date++n);
n=unique(date+,date++n)-date-;
//去重
// printf("%d\n",n);
for(int i=;i<;i++)refl[i]=i;
bool flag;
while(){
flag=;
for(int i=;i<=n;i++){
if(Zeller(
refl[date[i][]-'A']*+
refl[date[i][]-'A']*+
refl[date[i][]-'A']*+
refl[date[i][]-'A'],
refl[date[i][]-'A']*+
refl[date[i][]-'A'],
refl[date[i][]-'A']*+
refl[date[i][]-'A']
)==){
flag=;
break;
}
}
if(flag==){
printf("Case #%d: ",I);
for(int i=;i<;i++)printf("%d",refl[i]);
printf("\n");
break;
}else{
if(!next_permutation(refl,refl+))break;
}
}
if(flag==)printf("Case #%d: Impossible\n",I);
}
return ;
}
PS:蔡勒公式的巧妙之处在于它把1,2月当作去年的13,14月,因此将复杂的置闰放到了年底,简化了计算。
牛客多校第六场 G Is Today Friday? 蔡勒公式/排列的更多相关文章
- 2018牛客多校第六场 G.Pikachu
题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...
- 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解
题意: 给你\(A-J\)的字母组成的日期,形式为\(yyyy/mm/dd\).现给你\(n\)个这样的串\((n<=1e5)\),问你把字母映射成数字,并且使得所有日期合法且为星期五的最小字典 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第四场 G Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...
- 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板
链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...
- 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- 2018牛客多校第六场 I.Team Rocket
题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...
随机推荐
- QDomDocument::clear()的调用,会导致关闭程序时崩溃!!!
//读一份xml前,先清理m_Doc[QDomDocument] bool XmlIO::xmlRead(QString &errmsg) { m_mutex.lock(); // m_Doc ...
- Java实体与Json操作类
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.Jav ...
- microservice-cloud-03-provider-product-8001
server: port: 8001 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文 ...
- Dart编程实例 - 类型测试操作符is
Dart编程实例 - 类型测试操作符is void main() { int n = 2; print(n is int); } 本文转自:http://codingdict.com/article/ ...
- 如何基于 Nacos 和 Sentinel ,实现灰度路由和流量防护一体化
基于Alibaba Nacos和Sentinel,实现灰度路由和流量防护一体化的解决方案,发布在最新的 Nepxion Discovery 5.4.0 版,具体参考: 源码主页,请访问 源码主页指南主 ...
- redis常用命令建议
1. Redis查看当前所有的key KEYS * 2. 查看当前redis的配置信息 CONFIG GET * 3. MISCONF Redis is configured to save RDB ...
- WebBug靶场基础篇 — 02
本篇以第一人称记录这个关卡的第 1-5 关. 由于我记录的过程有点偏向于思考,所以截图截的多 = =!所以文章有点长... 下午一觉醒来,已经 4 点多了,然后开电脑,在虚拟机里,铺了铺靶场,但是毕竟 ...
- Linux环境进程间通信----信号与管道
一.信号: 信号主要用来通知进程异步事件的发生.可以使用“kill -l ”命令来显示系统中的信号.进程可以忽略大部分信号,但是有两个是不能忽略的: (1)SIGSTOP:这个信号将中断进程的执行. ...
- equals与==的区分
equals与==的区分 对于比较数值 public class Test { public static void main(String[] args){ int a=30; int b=30; ...
- (转) C#中使用throw和throw ex抛出异常的区别
通常,我们使用try/catch/finally语句块来捕获异常,就像在这里说的.在抛出异常的时候,使用throw和throw ex有什么区别呢? 假设,按如下的方式调用几个方法: →在Main方法中 ...