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


浙公网安备 33010602011771号