题意:

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

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

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

  2. 2019牛客多校第六场 E Androgynos

    传送门:https://ac.nowcoder.com/acm/contest/886/E 首先要同构的话,必须补图和原图边数一样,完全图总边数就必须是偶数,那么只有n%4=1 和 n%4=0时总边数 ...

  3. 牛客多校第六场 E Androgynos 自补图

    题意: 给定点数,构造自补图,要求输出邻接矩阵,和原图与补图的同构映射. 题解: 只有点数为4k和4k+1的情况才能构造自补图,因为只有这些情况下边数才为偶数. 一种构造方式是,邻接矩阵和同构映射增量 ...

  4. 牛客多校第五场 G subsequence 1 最长公共子序列/组合数

    题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列 ...

  5. [题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/886/B 题意: 您将获得一个IPv6地址,该地址是128位二进制字符串.请根据以下规则确定其最短的表示: 以十六进 ...

  6. [manacher][hash]Magic Spells 2022牛客多校第9场 G

    题目描述 One day in the magic world, the young wizard RoundDog was learning the compatibility of spells. ...

  7. 【2022牛客多校第六场 Z题 Game on grid】dp

    题目描述 输入描述 2 3 3 -B -B BB. 1 3 - 输出描述 no no yes no yes no 题意 有一个n*m的棋盘,Alice和Bob轮流进行操作,每操作一步都是从当前点到右边 ...

  8. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  9. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

最新文章

  1. 定义变量时无引号,单引号,双引号区别与特点:
  2. mysql什么实务_MysQL是什么类型的据库?
  3. 美团技术:到店结算平台实践(胶片)
  4. Linux性能优化之“关闭Ctrl+Alt+Del”
  5. 学编程面试通不过_我从编程面试中学到了什么
  6. startActivity流程(上)
  7. Debenham养老金项目关键流程1-员工分类流程
  8. BP神经网络算法:将参数矩阵向量化
  9. Linux Windows下忘记mysql超级管理员root密码的解决办法
  10. 经典的SQL面试题及答案
  11. MDK5之.map文件解析
  12. android studio无法连接小米手机问题解决
  13. java poi将每一个cell设置为文本格式
  14. 题目 1567: 超级玛丽
  15. 华为路由器:配置禁止P2P软件下载的示例
  16. 为了上班摸鱼我用Python制作了俄罗斯方块?
  17. 灰度图转bmp文件 C++
  18. HTML表单标签和HTML5新标签
  19. 云大博士计算机系的刘明,刘明(西南大学计算机与信息科学学院讲师)_百度百科...
  20. 云安全初识之云计算篇

热门文章

  1. laravel改代码没变化_菜鸡程序员是如何写代码的?
  2. OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
  3. java实现 mysql 身份认证,java-从Filter中的数据库对用户进行身份验证是一种好习惯吗?...
  4. win10 电脑触摸板不能滑动_用好笔记本的触摸板(win10小技巧)
  5. ios uiview动画_iOS UIView动画
  6. android实例教程_改造Android示例教程
  7. java.lang.ArrayIndexOutOfBoundsException
  8. P2P网络借贷系统-核心功能-用户投标-业务解说
  9. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
  10. Android开发— 2016_最流行的Android组件、工具、框架大全(二)