• 17-09-03模拟赛


    T1:考虑根据各颜色卡牌的数量进行分类讨论。

    Code:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 inline int in(){
     6     int x=0;bool f=0; char c;
     7     for (;(c=getchar())<'0'||c>'9';f=c=='-');
     8     for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0');
     9     return f?-x:x;
    10 }
    11 const char ch[3]={'B','G','R'};
    12 int sum[3],a[4],b[4],c[4],cnt[3],n;
    13 char s[205];
    14 int main()
    15 {
    16     n=in();if (!n) return 0;scanf("%s",&s);
    17     for (int i=0;i<n;++i) {
    18         switch (s[i]){
    19             case 'B':++sum[0];break;
    20             case 'G':++sum[1];break;
    21             case 'R':++sum[2];break;
    22         }
    23     }
    24     for (int i=0;i<3;++i){
    25         if (!sum[i]) a[++cnt[0]]=i;
    26         else if (sum[i]==1) b[++cnt[1]]=i;
    27         else c[++cnt[2]]=i;
    28     }
    29     if (!cnt[0]) {printf("BGR");return 0;}
    30     if (cnt[0]==2) {printf("%c",cnt[1]?ch[b[1]]:ch[c[1]]);return 0;}
    31     if (!cnt[1]) {printf("BGR");return 0;}
    32     if (cnt[1]==2) {printf("%c",ch[a[1]]);return 0;}
    33     if (cnt[1]==1) {ch[a[1]]<ch[b[1]]?printf("%c%c",ch[a[1]],ch[b[1]]):printf("%c%c",ch[b[1]],ch[a[1]]);return 0;}
    34     return 0;
    35 }

     T2:可以证明,对于一个递增数列a,如果 aw是平均数减中位最大时的中位数,l表示在w两边分别取相邻数字的数量,f(w,l)表示以aw为中位数,在w两侧各取相邻l个数时平均数减中位数的值,那么f(w,l)为关于l的单峰函数。同时可以证明取奇数个数时答案的最大值大于取偶数个数时答案的最大值。

    考虑将所有数从小到大排序后枚举中位数,在中位数两端各取w个数使平均数最大,小于中位数的数应尽可能接近中位数,同时大于中位数的数应尽可能远离中位数。该操作可以使用前缀和求出区间和。

    注意到f(w,l)单峰,考虑用三分法查找最值。

    Code:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define eps 1e-8
     5 #define MN 100005
     6 using namespace std;
     7 inline int in(){
     8     int x=0;bool f=0; char c;
     9     for (;(c=getchar())<'0'||c>'9';f=c=='-');
    10     for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0');
    11     return f?-x:x;
    12 }
    13 double res,lres,rres,ans,mres;
    14 int a[MN],sum[MN],n,lmid,rmid,lsum,rsum,msum;
    15 int main()
    16 {
    17     n=in();for (int i=1;i<=n;++i) a[i]=in();sort(a+1,a+n+1);
    18     sum[0]=0;for (int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i];
    19     if (n<=2) {printf("0.00");return 0;}
    20     for (int i=1;i<=n;++i){
    21         int l=0,r=min(i-1,n-i);
    22         while (l<r){
    23             int lmid=l+(r-l)/3,rmid=r-(r-l)/3;
    24             lres=(double)(sum[i]-sum[i-lmid-1]+sum[n]-sum[n-lmid])/(double)((lmid<<1)+1)-(double)a[i];
    25             rres=(double)(sum[i]-sum[i-rmid-1]+sum[n]-sum[n-rmid])/(double)((rmid<<1)+1)-(double)a[i];
    26             if (lres<rres) l=lmid+1;else r=rmid-1;
    27         }mres=(double)(sum[i]-sum[i-l-1]+sum[n]-sum[n-l])/(double)((l<<1)+1)-(double)a[i];ans=max(ans,mres);
    28     }printf("%.2lf",ans);return 0;
    29 }

     T3:

    注意到四位密码最多只有104种可能,考虑枚举密码判断可行性。

    将所有操作压缩至一个字符串中。记fi,j为第i位向后的第一个j数字的位置。因为一个数可以被重复按,所以当第i位为k时,fi,k=i.

    考虑对每个密码在每个动作中check是否能够实现,若在所有n个动作中都能实现,则该操作可行。该操作的时间复杂度为O(n),总时间复杂度为O(104n).

    Code:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define MN 1000005
     5 using namespace std;
     6 inline int in(){
     7     int x=0;bool f=0; char c;
     8     for (;(c=getchar())<'0'||c>'9';f=c=='-');
     9     for (x=c-'0';(c=getchar())>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0');
    10     return f?-x:x;
    11 }
    12 int f[MN][10],sum[MN],a[4],n,t,ans=0;
    13 char s[MN];
    14 int main()
    15 {
    16     n=in();for (int i=1;i<=n;++i){
    17         t=in();scanf("%s",s+sum[i-1]);
    18         sum[i]=sum[i-1]+t;
    19     }int len=sum[n];
    20     for (int i=0;i<10;++i) f[len][i]=len;
    21     for (int i=len-1;i>=0;--i){
    22         memcpy(f[i],f[i+1],sizeof(f[i+1]));
    23         f[i][s[i]-'0']=i;
    24     }
    25     for (int i=0;i<10000;++i){
    26         int cnt=0,x=i;
    27         for (int j=0;j<4;++j) a[3-j]=x%10,x/=10; 
    28         for (int j=0;j<n;++j)
    29         if (f[f[f[f[sum[j]][a[0]]][a[1]]][a[2]]][a[3]]<sum[j+1]) ++cnt;
    30         if (cnt==n) ++ans;
    31     }printf("%d",ans);return 0;
    32 }

    T4:

  • 相关阅读:
    PAT(乙级)2020年冬季考试
    Educational Codeforces Round 105 (Rated for Div. 2)【ABC】
    三省吾身
    初识SpringBoot
    Controller 层中,到底是 返回界面 还是JSON?(转)
    IDEA控制台中文乱码解决
    springboot引入外部依赖jar包(转)
    Java7的try-with-resources声明(转)
    Java对象的序列化和反序列化(转)
    AcWing1303. 斐波那契前 n 项和(递推/矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/codingutopia/p/test170903.html
Copyright © 2020-2023  润新知