牛客多校第六场 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[100005]; char tmp[20]; //char week[10000][13][32]; int refl[15]; inline bool Leap(int year){if(year%400==0||(year%4==0 && year%100!=0))return 1;else return 0; } inline bool days31(int month){return (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12); } inline bool Zeller(int year,int month,int day){if(year<1600)return 0;if(month==0 || month >=13)return 0;if(day<=0)return 0; if(month==2){if(Leap(year)){if(day>29)return 0;}else{if(day>28)return 0;}}if(days31(month)){if(day>31)return 0;}else{if(day>30)return 0;}//判断日期合法性 if (month == 1 || month == 2){year--;month += 12;}//判断month是否为1或2 int c = year / 100;int y = year - c * 100;int week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;week%=7;week+=7;week%=7;return (week==5); } int main(){int T;scanf("%d",&T);for(int I=1;I<=T;I++){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",tmp); // 0000/00/00tmp[4]=0;tmp[7]=0;date[i].clear();date[i]+=tmp;date[i]+=tmp+5;date[i]+=tmp+8;}sort(date+1,date+1+n);n=unique(date+1,date+1+n)-date-1;//去重 // printf("%d\n",n);for(int i=0;i<10;i++)refl[i]=i;bool flag;while(1){flag=1;for(int i=1;i<=n;i++){if(Zeller(refl[date[i][0]-'A']*1000+refl[date[i][1]-'A']*100+refl[date[i][2]-'A']*10+refl[date[i][3]-'A'],refl[date[i][4]-'A']*10+refl[date[i][5]-'A'],refl[date[i][6]-'A']*10+refl[date[i][7]-'A'])==0){flag=0;break;}}if(flag==1){printf("Case #%d: ",I);for(int i=0;i<10;i++)printf("%d",refl[i]);printf("\n");break;}else{if(!next_permutation(refl,refl+10))break;}}if(flag==0)printf("Case #%d: Impossible\n",I);}return 0; }
PS:蔡勒公式的巧妙之处在于它把1,2月当作去年的13,14月,因此将复杂的置闰放到了年底,简化了计算。
转载于:https://www.cnblogs.com/isakovsky/p/11300375.html
牛客多校第六场 G Is Today Friday? 蔡勒公式/排列相关推荐
- 牛客多校第六场-H-Pair
链接:https://ac.nowcoder.com/acm/contest/887/H 来源:牛客网 题目描述 Given three integers A, B, C. Count the num ...
- 2019牛客多校第六场 E Androgynos
传送门:https://ac.nowcoder.com/acm/contest/886/E 首先要同构的话,必须补图和原图边数一样,完全图总边数就必须是偶数,那么只有n%4=1 和 n%4=0时总边数 ...
- 牛客多校第六场 E Androgynos 自补图
题意: 给定点数,构造自补图,要求输出邻接矩阵,和原图与补图的同构映射. 题解: 只有点数为4k和4k+1的情况才能构造自补图,因为只有这些情况下边数才为偶数. 一种构造方式是,邻接矩阵和同构映射增量 ...
- 牛客多校第五场 G subsequence 1 最长公共子序列/组合数
题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列 ...
- [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)
题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进 ...
- [manacher][hash]Magic Spells 2022牛客多校第9场 G
题目描述 One day in the magic world, the young wizard RoundDog was learning the compatibility of spells. ...
- 【2022牛客多校第六场 Z题 Game on grid】dp
题目描述 输入描述 2 3 3 -B -B BB. 1 3 - 输出描述 no no yes no yes no 题意 有一个n*m的棋盘,Alice和Bob轮流进行操作,每操作一步都是从当前点到右边 ...
- 24dian(牛客多校第三场)
24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
最新文章
- 定义变量时无引号,单引号,双引号区别与特点:
- mysql什么实务_MysQL是什么类型的据库?
- 美团技术:到店结算平台实践(胶片)
- Linux性能优化之“关闭Ctrl+Alt+Del”
- 学编程面试通不过_我从编程面试中学到了什么
- startActivity流程(上)
- Debenham养老金项目关键流程1-员工分类流程
- BP神经网络算法:将参数矩阵向量化
- Linux Windows下忘记mysql超级管理员root密码的解决办法
- 经典的SQL面试题及答案
- MDK5之.map文件解析
- android studio无法连接小米手机问题解决
- java poi将每一个cell设置为文本格式
- 题目 1567: 超级玛丽
- 华为路由器:配置禁止P2P软件下载的示例
- 为了上班摸鱼我用Python制作了俄罗斯方块?
- 灰度图转bmp文件 C++
- HTML表单标签和HTML5新标签
- 云大博士计算机系的刘明,刘明(西南大学计算机与信息科学学院讲师)_百度百科...
- 云安全初识之云计算篇
热门文章
- laravel改代码没变化_菜鸡程序员是如何写代码的?
- OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
- java实现 mysql 身份认证,java-从Filter中的数据库对用户进行身份验证是一种好习惯吗?...
- win10 电脑触摸板不能滑动_用好笔记本的触摸板(win10小技巧)
- ios uiview动画_iOS UIView动画
- android实例教程_改造Android示例教程
- java.lang.ArrayIndexOutOfBoundsException
- P2P网络借贷系统-核心功能-用户投标-业务解说
- Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
- Android开发— 2016_最流行的Android组件、工具、框架大全(二)