题意:

有一堆日期,这些日期都是星期五,但是数字被映射成了字母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? 蔡勒公式/排列的更多相关文章

  1. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  2. 牛客多校第六场G Is Today Friday?(吉姆拉尔森/蔡勒公式 + 思维)题解

    题意: 给你\(A-J\)的字母组成的日期,形式为\(yyyy/mm/dd\).现给你\(n\)个这样的串\((n<=1e5)\),问你把字母映射成数字,并且使得所有日期合法且为星期五的最小字典 ...

  3. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  4. 牛客多校第四场 G Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...

  5. 牛客多校第六场 C Generation I 组合数学 阶乘逆元模板

    链接:https://www.nowcoder.com/acm/contest/144/C来源:牛客网 Oak is given N empty and non-repeatable sets whi ...

  6. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

    链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...

  7. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  8. 字符串dp——牛客多校第五场G

    比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...

  9. 2018牛客多校第六场 I.Team Rocket

    题意: 给出n个区间和m个点(点按顺序给出且强制在线).每个区间只会被第一个他包含的点摧毁.问每个点能摧毁多少个区间以及每个区间是被哪个点摧毁的. 题解: 将n个区间按照左端点排序,然后用vector ...

随机推荐

  1. ajax 实战使用

    注意ajax 必须放在script脚本中使用 ajax用于前端朝后端提交数据,并且后端函数处理好结果返回给success函数作为回调函数给前端,前端拿到后端传来的值,比如code==0 来做相应的前端 ...

  2. PHP ftp_delete() 函数

    定义和用法 ftp_delete() 函数删除 FTP 服务器上的一个文件. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_delete(ftp_conne ...

  3. 【Codeforces Round #429 (Div. 2) C】Leha and Function

    [Link]:http://codeforces.com/contest/841/problem/C [Description] [Solution] 看到最大的和最小的对应,第二大的和第二小的对应. ...

  4. 数学二分——cf700A

    二分答案 #include<bits/stdc++.h> using namespace std; #define ll long long int n,l,v1,v2,k; double ...

  5. git+可视化工具+github/码云

    git (实际上git和TortoiseGIT是一回事,只是TortoiseGIT把git命令行功能做了一个可视化处理,所以下面git和TortoiseGIT实现功能是一样的) 1.如何使用Git上传 ...

  6. PHP简单读取XML

    DOM document object model,文档对象模型,就是树形结构 节点的分类 元素节点 属性节点 值节点 注释节点 根节点(document才是根节点) 生成XML文档 xml的根节点为 ...

  7. 使用VS2015制作安装包( 含相关的下载链接)

    补充: 在看下面的教程过程中,如果在下面的步聚1中没有 " Visual Studio Installer", 则需要通过下面的链接进行安装 Visual Studio Insta ...

  8. 7. Jmeter-逻辑控制器介绍与使用

    逻辑控制器介绍与使用 如果(if)控制器 事物控制器 循环控制器 while controller critical section controller foreach控制器 include con ...

  9. CentOS 安装MySQL(rpm)提示错误Header V3 DSA/SHA1 Signature

    提示错误:Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY error: Failed dependencies 错误原因:这是由于yum安装了 ...

  10. HDU 6627 equation (分类讨论)

    2019 杭电多校 5 1004 题目链接:HDU 6627 比赛链接:2019 Multi-University Training Contest 5 Problem Description You ...