Fork me on GitHub

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分(气死我了),再卡一卡就

  要好好分析数据范围啊。

  

posted @   Doria_tt  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示