牛客多校第六场 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 ...
随机推荐
- JMeter4.0 IF Controller
推荐使用 __jexl3 函数生成 if controller判断条件 举个栗子: 1. 假如条件为 "${demo}" == "test" 2. 在If Co ...
- GitHub 万星推荐:黑客成长技术清单
GitHub 万星推荐:黑客成长技术清单 导语:如果你需要一些安全入门引导,“Awesome Hacking”无疑是最佳选择之一. 最近两天,在reddit安全板块和Twitter上有个GitHub项 ...
- Openstack组件部署 — Netwotking service组件介绍与网络基本概念
目录 目录 前文列表 Openstack Networking serivce 基本的Neutron概念 Neutron的抽象对象 网络networks 子网subnets 路由器routers 端口 ...
- Jeecg集成Swagger-ui
<context:component-scan base-package="springfox"/> <bean class="org.jeecgfra ...
- cmd 修改当前路径
cd 命令需要加/d,如:
- \t \r \n转义字符
t \r \n都是转义字符,空格就是单纯的空格,输入时可以输入空格 \t 的意思是 横向跳到下一制表符位置 \r 的意思是 回车 \n 的意思是回车换行 所有的转义字符和所对应的意义: 转义字符 意义 ...
- 获取hdfs集群信息(fs.defaultFS)
[root@hive-dp-7bd6fd4d55-wctjn hive-1.1.0-cdh5.14.0]# hdfs getconf -confKey fs.default.name19/12/04 ...
- Gradle安装配置(Windows)
在本教程中,我们将学习 Gradle 的安装,对于一个初学者,有时安装开发环境也是一个比较麻烦的问题.如果按照 Gradle 官方网站的说明安装,则可能会遇到一些麻烦,有时还要在互联网上做一些搜索,查 ...
- leetcode.数组.27移除元素-Java
1. 具体题目 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空 ...
- PWM,SBUS,PPM信号转模拟电压的方案
PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务.---------------- 案例场景 有个内部采用 ...