2019牛客暑假多校训练赛第六场G题 Is Today Friday? (全排列)

题目链接:https://ac.nowcoder.com/acm/contest/886/G

题意:给定由A到J组成的字符串,A到J唯一代表0到9中的数字(双射),问是否存在一个合法的双射使得所有的给定的字符串都是星期五(现实中的星期五),并且要使得A到J对应的0到9的字典序最小

 

思路:运用蔡勒公式,然后从字典序最小的开始全排列一个一个判断

#include 
using namespace std;
const int N=1e5+5;
int n,m,t,cas=1;
string s[N];
int a[10];
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inline bool check(int year, int mon, int day){
    if(year<1600)return false;
    if(mon==0||mon>12)return false;
    int tmp=days[mon];
    if(mon==2)if((year%4==0&&year%100!=0)||year%400==0)tmp=29;
    if(day==0||day>tmp)return false;
    ///蔡勒公式
    if(mon<=2)mon+=12,year--;
    int c=year/100;
    year%=100;
    int w=((year+year/4+c/4-2*c+(26*(mon+1))/10+day-1)%7+7)%7;
    return w==5;
}
int main(){
    scanf("%d",&t);
    while(t--){
        printf("Case #%d: ", cas++);
        for(int i=0;i<=9;i++)a[i]=i;
        scanf("%d",&n);
        for(int i=0;i>s[i];
        sort(s,s+n);
        int realn=unique(s,s+n)-s;
        bool flag=false;
        do{
            bool test=true;
            for(int i=0;i

 

你可能感兴趣的:(acm算法学习)