zoukankan      html  css  js  c++  java
  • 【hihoCoder】【挑战赛#12】

    模拟+枚举+模拟……+构造


      QAQAQQQ rank12求杯子!

    A 顺子

      ……模拟题,分类讨论一下就好了……比如当前四张牌是不是同一花色……是不是连续的四张牌,如果是连续的四张牌,是不是两边的……(呀我好像忘了判左边。。。只判了J Q K A。。。。没判A 2 3 4。。。

      没关系加几个字符就好了……嗯代码已改

     1 //hihocoder 12 A
     2 #include<vector>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cstdlib>
     6 #include<iostream>
     7 #include<algorithm>
     8 #define rep(i,n) for(int i=0;i<n;++i)
     9 #define F(i,j,n) for(int i=j;i<=n;++i)
    10 #define D(i,j,n) for(int i=j;i>=n;--i)
    11 using namespace std;
    12 typedef long long LL;
    13 inline int getint(){
    14     int r=1,v=0; char ch=getchar();
    15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    17     return r*v;
    18 }
    19 const int N=1e5+10;
    20 /*******************template********************/
    21 
    22 bool hv[20];
    23 char s[7][5];
    24 int id1(char ch){
    25     if (ch>='2' && ch<='9') return ch-'0';
    26     if (ch=='A') return 1;
    27     if (ch=='J') return 11;
    28     if (ch=='Q') return 12;
    29     if (ch=='K') return 13;
    30 }
    31 int id2(char ch){
    32     if (ch=='S') return 1;
    33     if (ch=='H') return 2;
    34     if (ch=='C') return 3;
    35     if (ch=='D') return 4;
    36 }
    37 int main(){
    38     bool sign=0;
    39     F(i,1,4){
    40         scanf("%s",s[i]);
    41         if (s[i][0]=='1'){hv[10]=1; s[i][1]=s[i][2];continue;}
    42         hv[id1(s[i][0])]=1;
    43         if (id1(s[i][0])==1) hv[14]=1;
    44     }
    45     F(i,2,4) if (s[i][1]!=s[i-1][1]) sign=1;
    46     F(i,1,11){
    47         int sum=0;
    48         F(j,0,3) sum+=hv[i+j];
    49         if (sum==4){
    50             if (i!=11 &&i!=1){
    51                 if (sign) puts("1/6");
    52                 else puts("1/8");
    53             }else{
    54                 if (sign) puts("1/12");
    55                 else puts("1/16");
    56             }
    57             return 0;
    58         }
    59     }
    60     F(j,11,14)
    61     F(i,1,10){
    62         int sum=0;
    63         F(j,0,4) sum+=hv[i+j];
    64         if (sum==4){
    65             if (sign) puts("1/12");
    66             else puts("1/16");
    67             return 0;
    68         }
    69     }
    70     puts("0/1");
    71     return 0;
    72 }
    View Code

    B 计数

      介个……O(n)枚举吧,$10^7$的枚举还是不虚的。

      然而这题我又傻逼了……我用的是set插入的,带了log……居然还能过(可能是满足条件的点太少?其实是数据太弱。。。?

     1 //hihocoder 12 B
     2 #include<set>
     3 #include<vector>
     4 #include<cstdio>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<iostream>
     8 #include<algorithm>
     9 #define rep(i,n) for(int i=0;i<n;++i)
    10 #define F(i,j,n) for(int i=j;i<=n;++i)
    11 #define D(i,j,n) for(int i=j;i>=n;--i)
    12 using namespace std;
    13 typedef long long LL;
    14 inline int getint(){
    15     int r=1,v=0; char ch=getchar();
    16     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    17     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    18     return r*v;
    19 }
    20 const int N=1e5+10;
    21 /*******************template********************/
    22 
    23 LL n,L,R;
    24 set<LL>s;
    25 
    26 int main(){
    27     n=getint(); L=getint(); R=getint();
    28     F(i,1,10000000){
    29         LL t=i^(n*i);
    30         if (t>=L && t<=R) s.insert(t);
    31     }
    32     printf("%d
    ",s.size());
    33     return 0;
    34 }
    View Code

    C 永恒游戏

      神题,蒟蒻并不会做……经过大胆猜想,不用(hui)证明,yy了一个做法:每次找度数最小的可操作点进行操作,然后模拟10W次……居然就过了……过了……了……

      题解说:

    有一个定理保证,对于一个固定的初始局面,不论怎么操作,要么可以无限操作下去,要么在相同步数之后停在相同的局面上。所以只需要模拟100000次即可知道本题答案。

    定理的证明可以在以下论文中找到 http://www.cs.elte.hu/~lovasz/morepapers/chips.pdf (定理1.1)

      E文的paper差评QAQ,蒟蒻太傻逼看不懂啊QAQ

     1 //hihocoder 12 C
     2 #include<vector>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cstdlib>
     6 #include<iostream>
     7 #include<algorithm>
     8 #define rep(i,n) for(int i=0;i<n;++i)
     9 #define F(i,j,n) for(int i=j;i<=n;++i)
    10 #define D(i,j,n) for(int i=j;i>=n;--i)
    11 using namespace std;
    12 typedef long long LL;
    13 inline int getint(){
    14     int r=1,v=0; char ch=getchar();
    15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    17     return r*v;
    18 }
    19 const int N=210;
    20 /*******************template********************/
    21 
    22 
    23 int n,m,a[N][N],du[N],num[N];
    24 int main(){
    25     n=getint(); m=getint();
    26     F(i,1,n) num[i]=getint();
    27     F(i,1,m){
    28         int x=getint()+1,y=getint()+1;
    29         a[x][y]=a[y][x]=1;
    30         du[x]++; du[y]++;
    31     }
    32     F(i,1,100001){
    33         int mn=10000,t=-1;
    34         F(j,1,n)
    35             if (num[j]>=du[j])
    36                 if (du[j]<mn) mn=du[j],t=j;
    37         if (t==-1){
    38             printf("%d
    ",i-1); return 0;
    39         }
    40         F(j,1,n){
    41             if (a[t][j]) num[j]++,num[t]--;
    42         }
    43     }
    44     puts("INF");
    45     return 0;
    46 }
    View Code

    D 天下无骰

      神一样的构造题……

      然而我连题都没读对

      其实是:决策树上的叶子可以有很多,而且可以多个叶子标相同的号,只要保证标同一个号的叶子的概率之和为$frac{1}{n}$即可……

      然而如果是必须要只能一个叶子呢?我yy的做法是这样的:(口胡时间√)

        首先我们一定要有一个$frac{1}{2}$的硬币……因为最后两个叶子之间的概率必然得相等……

        然后我们现在就可以处理n是2的幂的情况了

        然后我们考虑另一个硬币可以做什么?可以将不是2的幂的情况,比如5,变成2的幂的和(1+4)然而只能分出来两个……所以是二进制表示中1的数量=2的才可以……

      然而这并不是本题正解233只是感觉这个思路很有趣不想让它就这么消失……说不定哪天我可以出一道题(大雾)?2333。。。。

      至于正解。。。太麻烦了蒟蒻看不懂QAQ

     1 //hihocoder 12 D
     2 #include<vector>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cstdlib>
     6 #include<iostream>
     7 #include<algorithm>
     8 #define rep(i,n) for(int i=0;i<n;++i)
     9 #define F(i,j,n) for(int i=j;i<=n;++i)
    10 #define D(i,j,n) for(int i=j;i>=n;--i)
    11 using namespace std;
    12 typedef long long LL;
    13 inline int getint(){
    14     int r=1,v=0; char ch=getchar();
    15     for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1;
    16     for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch;
    17     return r*v;
    18 }
    19 const int N=5e5+10;
    20 /*******************template********************/
    21 
    22 int n,m,v[N],c[N][2],tot,a[N],num,p0,q0,p1,q1;
    23 bool sign[N];
    24 
    25 void dfs(int x,int a){
    26     if (a==1){
    27         sign[x]=1;
    28         return;
    29     }
    30     if (a%q0==0){
    31         v[x]=0;
    32         c[x][0]=++tot;
    33         c[x][1]=++tot;
    34         dfs(c[x][0],a/q0*p0);
    35         dfs(c[x][1],a/q0*(q0-p0));
    36         return;
    37     }
    38     if (a%q1==0){
    39         v[x]=1;
    40         c[x][0]=++tot;
    41         c[x][1]=++tot;
    42         dfs(c[x][0],a/q1*p1);
    43         dfs(c[x][1],a/q1*(q1-p1));
    44         return;
    45     }
    46 }
    47 void work(){
    48     puts("YES");
    49     printf("%d %d %d %d
    ",p0,q0,p1,q1);
    50     dfs(0,n);
    51     int num=0;
    52     printf("%d
    ",tot+1);
    53     F(i,0,tot-1){
    54         if (sign[i]){ printf("E %d
    ",num++); continue;}
    55         printf("C %d %d %d
    ",v[i],c[i][0],c[i][1]);
    56     }
    57     printf("E %d",num++);
    58 }
    59 
    60 int cnt(int x){
    61     int ans=0;
    62     while(x){
    63         ans+=x&1;
    64         x>>=1;
    65     }
    66     return ans;
    67 }
    68 int main(){
    69     m=n=getint();
    70     F(i,3,n){
    71         if (cnt(i)<=2) a[++num]=i;
    72     }
    73     while((m&1)==0) m>>=1;
    74     while(m%3==0) m/=3;
    75     p1=1,q1=2;
    76     if (m==1){
    77         p0=1,q0=3;
    78         work();
    79         return 0;
    80     }
    81     F(i,1,num){
    82         m=n;
    83         while((m&1)==0) m>>=1;
    84         while(m%a[i]==0) m/=a[i];
    85         if (m==1){
    86             q0=a[i];
    87             p0=a[i]&(-a[i]);
    88             work();
    89             return 0;
    90         }
    91     }
    92     puts("NO");
    93     return 0;
    94 }
    View Code(WA)
  • 相关阅读:
    java 类的关系
    Oracle lock table
    shell 标准输出重定向
    pygame 安装
    进程检查机制
    oracle pivot unpivot
    qt paintEvent
    centos7.5+Ambari2.7.3部署安装
    Linux机器间配置ssh互信
    普通视图和物化视图的区别
  • 原文地址:https://www.cnblogs.com/Tunix/p/4576395.html
Copyright © 2011-2022 走看看