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:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步