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 @ 2022-10-08 09:58  Doria_tt  阅读(45)  评论(0)    收藏  举报