zoukankan      html  css  js  c++  java
  • Codeforces Round #666 (Div. 2) (A B C D)

    ##Practice link: https://codeforces.ml/contest/1397

    solved: 3/5   rank:1488


    ##A. Juggling Letters

    思路:统计n个字符串中各个字符的数量,然后只要各个字符的数量可以整除n,答案就是YES。

    代码:

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<string>
     7 #include<vector>
     8 #include<stack>
     9 #include<bitset>
    10 #include<cstdlib>
    11 #include<cmath>
    12 #include<set>
    13 #include<list>
    14 #include<deque>
    15 #include<map>
    16 #include<queue>
    17 #define ll long long
    18 #define MOD 1000000007
    19 #define INF 0x3f3f3f3f
    20 #define mem(a,x) memset(a,x,sizeof(a))
    21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    22 using namespace std;
    23 const int maxn=1000005;
    24 inline int rd() {
    25     int res = 0,flag = 0;
    26     char ch;
    27     if ((ch = getchar()) == '-')flag = 1;
    28     else if(ch >= '0' && ch <= '9')res = ch - '0';
    29     while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0');
    30     return flag ? -res : res;
    31 }
    32 /*
    33 int head[maxn];
    34 int num=0;
    35 struct edg{
    36     int next,to,w;
    37 }edge[maxn];
    38 void add_edge(int u,int v,int w)
    39 {
    40     num++;
    41     edge[num].next=head[u];edge[num].to=v;edge[num].w=w;head[u]=num;
    42     edge[++num].next=head[v];edge[num].to=u;edge[num].w=w;head[v]=num;
    43 } */
    44 //-----------
    45 string s;
    46 int a[30];
    47 int main()
    48 {
    49     int T,n;
    50     cin>>T;
    51     while(T--){
    52         mem(a,0);
    53         cin>>n;
    54         for(int i=1;i<=n;i++){
    55             cin>>s;
    56             for(int j=0;j<s.size();j++){
    57                 a[s[j]-'a']++;
    58             }
    59         }
    60         int k=1;
    61         for(int i=0;i<26;i++){
    62             if(a[i]%n!=0){
    63                 k=0;
    64                 break;
    65             }
    66         }
    67         if(k){
    68             cout<<"YES"<<endl;
    69         }else{
    70             cout<<"NO"<<endl;
    71         }
    72     }
    73 }
    View Code

    ##B. Power Sequence

    思路:考虑当${}^{c^{i}}$的底数c>=2时,如果n>=50的情况下要变成的最大的数将达到$2^{50}$,那么由于$1leqslant a_{i}leqslant 10^{9}$,所以此时的答案一定是当底数c为1时,即$a_{i}$于1的差值。当n<50时,我们枚举从1到100000所有可行的底数,然后去最小值即可。

    代码:

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<string>
     7 #include<vector>
     8 #include<stack>
     9 #include<bitset>
    10 #include<cstdlib>
    11 #include<cmath>
    12 #include<set>
    13 #include<list>
    14 #include<deque>
    15 #include<map>
    16 #include<queue>
    17 #define ll long long
    18 #define MOD 1000000007
    19 #define INF 0x3f3f3f3f
    20 #define mem(a,x) memset(a,x,sizeof(a))
    21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    22 using namespace std;
    23 const int maxn=1000005;
    24 inline int rd() {
    25     int res = 0,flag = 0;
    26     char ch;
    27     if ((ch = getchar()) == '-')flag = 1;
    28     else if(ch >= '0' && ch <= '9')res = ch - '0';
    29     while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0');
    30     return flag ? -res : res;
    31 }
    32 /*
    33 int head[maxn];
    34 int num=0;
    35 struct edg{
    36     int next,to,w;
    37 }edge[maxn];
    38 void add_edge(int u,int v,int w)
    39 {
    40     num++;
    41     edge[num].next=head[u];edge[num].to=v;edge[num].w=w;head[u]=num;
    42     edge[++num].next=head[v];edge[num].to=u;edge[num].w=w;head[v]=num;
    43 } */
    44 //-----------
    45 string s;
    46 int a[100005];
    47 int main()
    48 {
    49     int n;
    50     cin>>n;
    51     ll num=0;
    52     for(int i=0;i<n;i++){
    53         scanf("%d",&a[i]);
    54         num+=abs(a[i]-1);
    55     }
    56     sort(a,a+n);
    57     if(n>=50){
    58         printf("%lld",num);
    59     }else{
    60         ll minn;
    61         for(int i=2;i<=100000;i++){
    62             ll p=1;
    63             minn=abs(a[0]-p);
    64             int kk=1;
    65             for(int j=1;j<n;j++){
    66                 p=p*i;
    67                 minn+=abs(a[j]-p);
    68                 if(p>10000000000000){
    69                     kk=0;
    70                     break;
    71                 }
    72             }
    73 //            cout<<minn<<endl;
    74             if(kk){
    75                 num=min(num,minn);
    76             }
    77         }
    78         cout<<num;
    79     }
    80         return 0;
    81 }
    View Code

     ##C. Multiples of Length

    思路:也就是把题目描述的操作证明一下。

             step1: 选择$left[ 1,n-1 ight]$这个区间,然后把这个区间上的${}_{a_{1}sim a_{n-1}}$加上$(n-1) imes a_{i}$ 那么此时$left[ 1,n-1 ight]$上   的${}_{a_{i}}$都变成了${}_{n imes a_{i}}$。

             step2: 把第n个数变成0。

             step3: 选择$left[ 1,n ight]$这个区间,这个区间上都是n的倍数,此时都加上${}_{-a_{i}}$即可。

             特别注意:当n=1时的情况。

    代码:

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<string>
     7 #include<vector>
     8 #include<stack>
     9 #include<bitset>
    10 #include<cstdlib>
    11 #include<cmath>
    12 #include<set>
    13 #include<list>
    14 #include<deque>
    15 #include<map>
    16 #include<queue>
    17 #define ll long long
    18 #define MOD 1000000007
    19 #define INF 0x3f3f3f3f
    20 #define mem(a,x) memset(a,x,sizeof(a))
    21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    22 using namespace std;
    23 const int maxn=1000005;
    24 inline int rd() {
    25     int res = 0,flag = 0;
    26     char ch;
    27     if ((ch = getchar()) == '-')flag = 1;
    28     else if(ch >= '0' && ch <= '9')res = ch - '0';
    29     while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0');
    30     return flag ? -res : res;
    31 }
    32 /*
    33 int head[maxn];
    34 int num=0;
    35 struct edg{
    36     int next,to,w;
    37 }edge[maxn];
    38 void add_edge(int u,int v,int w)
    39 {
    40     num++;
    41     edge[num].next=head[u];edge[num].to=v;edge[num].w=w;head[u]=num;
    42     edge[++num].next=head[v];edge[num].to=u;edge[num].w=w;head[v]=num;
    43 } */
    44 //-----------
    45 string s;
    46 ll a[100005];
    47 int main()
    48 {
    49     ll n;
    50     cin>>n;
    51     if(n==1){
    52         scanf("%lld",&a[1]);
    53         printf("1 1
    0
    1 1
    0
    1 1
    %lld",-a[1]);
    54     }else{
    55         for(int i=1;i<=n;i++){
    56             scanf("%lld",&a[i]);
    57         }
    58         printf("1 %lld
    ",n-1);
    59         for(int i=1;i<n;i++){
    60             printf("%lld%c",a[i]*(n-1)," 
    "[i==n-1]);
    61             a[i]=a[i]+a[i]*(n-1);
    62         }
    63         printf("%lld %lld
    ",n,n);
    64         printf("%lld
    ",-a[n]);
    65         a[n]=0;
    66         printf("1 %lld
    ",n);
    67         for(int i=1;i<n;i++){
    68             printf("%lld ",-a[i]);
    69         }
    70         printf("0");
    71     }
    72     return 0;
    73 }
    View Code

    ##D. Stoned Game

    题意:给你n堆石子,两个人轮流选一堆取石子,一个人不可以取上一个人取的那堆石子和已经没有了的那堆石子,最后不能取石子的人失败。

    思路:首先,如果最多的一堆石子的数量大于其它所有石子之和,那么先手必胜,即先手一直取最多的那堆石子。然后猜结论,石子总和为偶数,后手赢,否则先手赢。

    代码:

     1 //#include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<iostream>
     6 #include<string>
     7 #include<vector>
     8 #include<stack>
     9 #include<bitset>
    10 #include<cstdlib>
    11 #include<cmath>
    12 #include<set>
    13 #include<list>
    14 #include<deque>
    15 #include<map>
    16 #include<queue>
    17 #define ll long long
    18 #define MOD 1000000007
    19 #define INF 0x3f3f3f3f
    20 #define mem(a,x) memset(a,x,sizeof(a))
    21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    22 using namespace std;
    23 const int maxn=1000005;
    24 inline int rd() {
    25     int res = 0,flag = 0;
    26     char ch;
    27     if ((ch = getchar()) == '-')flag = 1;
    28     else if(ch >= '0' && ch <= '9')res = ch - '0';
    29     while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0');
    30     return flag ? -res : res;
    31 }
    32 /*
    33 int head[maxn];
    34 int num=0;
    35 struct edg{
    36     int next,to,w;
    37 }edge[maxn];
    38 void add_edge(int u,int v,int w)
    39 {
    40     num++;
    41     edge[num].next=head[u];edge[num].to=v;edge[num].w=w;head[u]=num;
    42     edge[++num].next=head[v];edge[num].to=u;edge[num].w=w;head[v]=num;
    43 } */
    44 //-----------
    45 int n;
    46 int a[105];
    47 int main()
    48 {
    49     int T;
    50     int sum;
    51     cin>>T;
    52     while(T--){
    53         cin>>n;
    54         sum=0;
    55         for(int i=1;i<=n;i++){
    56             scanf("%d",&a[i]);
    57             sum+=a[i];
    58         }
    59         sort(a+1,a+n+1);
    60         if(a[n]>sum-a[n]){
    61             printf("T
    ");
    62         }else{
    63             if(sum%2==0){
    64                 printf("HL
    ");
    65             }else{
    66                 printf("T
    ");
    67             }
    68         }
    69     }
    70     return 0;
    71 }
    View Code

    ##E. Monster Invaders :0

    越自律,越自由
  • 相关阅读:
    zech的神秘题库(武汉理工夜莺杯)
    回归第六题
    同余方程
    牛牛选路径(牛客)
    回归第三题
    区间dp复习提高专题
    乘法逆元(线性递推)
    回归第八题
    JAVA启动参数大全之二:非标准参数(转)
    (转)Spring Security 3.1 自定义实例之登陆
  • 原文地址:https://www.cnblogs.com/ha-chuochuo/p/13591843.html
Copyright © 2011-2022 走看看