CSP模拟赛4】
【初二国庆集训 CSP模拟赛4】
面试【第二场T1】
用map
统计即可
#include<bits/stdc++.h> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { string s; cin>>s; map<char,int> ma; for(int i=0;i<s.length();i++) { ma[s[i]]++; } if(ma['D']>=1||ma['C']>=2) printf("failed\n"); else if(ma['D']==0&&ma['A']>=3) printf("sp offer\n"); else printf("offer\n"); } return 0; }
纸牌游戏【第二场T2】
因为想要尽可能多的淘汰人,理所当然是每个人都去拿牌最少的人,又因为每个人都可以拿一定数量别人的牌,所以只要当他拿别人牌的数量大于等于比除他以外的人的数量,那么他就不会被淘汰
将每个人能拿的牌数按小到大排序后,每个人都会优先去拿他的牌,假设这是第i个人,那么就有n-i个人能拿他的牌(前面i个人已经被淘汰了),
因为当a[i]>=n-i时,意味着当你的牌被别人拿了一些后,你就可以通过拿走别人的补回你自己的牌数,自然就可以补回来,死循环了
索引从0开始的话就是n-i-1个人能拿他的牌
所以把每个人能拿的牌按从小到大排序后,只要找到第一个不会被淘汰的人即可知道最少可以剩下多少人
#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int n,a[100010]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); for (int i=1;i<=n;i++) if (a[i]>=n-i) { printf("%d",n-i+1); break; } return 0; }
涨薪【第二场T3】
简单的贪心。
要想支付的钱最多,那么给绩效A和绩效B工资最高的人涨薪即可
注意要用到快速幂 (还好昨天才学了矩阵快速幂)
#include <bits/stdc++.h> using namespace std; const int mod = 1e9 + 7; int a[100005]; bool cmp(int x,int y) { return x>y; } long long qpow(long long a,long long b) { long long ans=1; while(b) { if(b%2==1) { ans=((ans%mod)*(a%mod))%mod; if(ans<0) ans+=mod; } a=((a%mod)*(a%mod))%mod; if(a<0) a+=mod; b>>=1; } return ans; } int main() { // freopen("tiaoxin.in","r",stdin); int n, m, x, y; long long ans=0; scanf("%d %d %d %d",&n, &m, &x, &y) ; for(int i = 1;i <= n;i++) scanf("%d", &a[i]); sort(a + 1, a + n + 1,cmp); long long w2=qpow(3,m); for(int i=1;i<=x;i++) { ans=ans%mod+(long long)a[i]%mod*w2%mod; if(ans<0) ans+=mod; } long long w3=qpow(2,m); for(int i=x+1;i<=x+y;i++) { ans=ans%mod+(long long)a[i]%mod*w3%mod; if(ans<0) ans+=mod; } int sum=0; for(int i=x+y+1;i<=n;i++) { sum=sum%mod+a[i]%mod; if(sum<0) sum+=mod; } if(m<2) ans=ans+(long long)sum%mod*m%mod; if(ans<0) ans+=mod; printf("%lld",ans%mod); return 0; }
变换【第二场T4】
让所有数字相同,即使所有数字的GCD。先用埃筛把素数表算出来,然后暴力地去分解质因数
#include<bits/stdc++.h> using namespace std; int n,sum,a[1100000],pri[10005],v[10005],ans; int GCD(int a,int b) { if(b==0) return a; return GCD(b,a%b); } void zs(){ for(int i=2;i<=10005;i++) { if(!v[i]) pri[++pri[0]]=i; for(int j=1;j<=pri[0]&&pri[j]*i<=10005;j++) v[j*i]=1; } } int main(){ scanf("%d",&n); zs(); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sum=a[1]; for(int i=2;i<=n;i++) sum=GCD(sum,a[i]); for(int i=1;i<=n;i++) a[i]=a[i]/sum; for(int i=1;i<=n;i++) { for(int j=1;j<=pri[0]&&pri[j]*pri[j]<=a[i];j++) { while(a[i]%pri[j]==0) { a[i]/=pri[j]; ans++; } if(a[i]==1) break; } if(a[i]!=1) ans++; } printf("%d",ans); }
小结
这场比赛较简单,几乎没有涉及算法。主要是思维,还有数学知识。
考场得分如下:
面试 |
纸牌游戏 |
涨薪 |
变换 |
总分 |
![]() |
![]() |
![]() |
![]() |
250/400 |
T2每个人都去拿牌最少的人这个思路我是想到了的,但没有转过死循环的弯。
T4我直接骗的20,但暴力有60分(气死我了),再卡一卡就了
要好好分析数据范围啊。
本文来自博客园,作者:Doria_tt,转载请注明原文链接:https://www.cnblogs.com/pangtuan666/p/16768077.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现