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:

转载于:https://www.cnblogs.com/codingutopia/p/test170903.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值