牛客模拟赛2【普及组】

题号题目
T1面试
T2纸牌游戏
T3涨薪
T4变换
得分11.56/400

T1

思路

直接模拟题意即可。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,jsd,jsc,jsa;
string s;
int main()
{
	cin>>n;
	for(int i=1; i<=n; i++)
	 {
	 	cin>>s;
	 	for(int i=0; i<=s.size()-1; i++)
	 	  {
	 	  	if(s[i]=='D')
	 	  	  jsd++;
		 	else if(s[i]=='C')
		  	  jsc++;
	     	else if(s[i]=='A')
	      	  jsa++;
		   }
	     if(jsd==0&&jsa>=3)
	       cout<<"sp offer"<<endl;
	     else if(jsd>=1||jsc>=2)
	       cout<<"failed"<<endl;
	     else
	       cout<<"offer"<<endl;
	 }
	return 0;
}

T2

思路

如果当前有 Q Q Q 个人,且每个人的 a i a_i ai​ 都大于等于 Q − 1 Q-1 Q1
那么他们每个人都可以从其他所有人手中拿一张牌,游戏可以无限的进行下去。
反之,若其中至少有一个人的 a i a_i ai 小于 Q − 1 Q-1 Q1
那么其他人可以一起拿他的牌,一轮下来他就会减少 Q − 1 Q-1 Q1 张牌,
而他又只能补充 a i < Q − 1 a_i < Q-1 ai<Q1 张牌,
几个回合之后他就会被淘汰出局。

根据上述结论,先对 a i a_i ai 排序,然后枚举 Q Q Q 即可

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[100010];
int n,ans;
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	cin>>n;
	for(int i=1; i<=n; i++)
	   scanf("%d",&a[i]);
	sort(a+1,a+1+n,cmp);
	for(int i=1; i<=n; i++)
	 if(a[i]>=i-1)
	   ans++;
	cout<<ans;
	return 0;
}

T3

思路

由题意我们可以得出一个简单的贪心思路。
对于初始工资最小的 n − x − y n-x-y nxy 个人,
我们压根不用管它,因为这一定不是最优的;
所以我们只需要对初始工资排序,让最大的 x x x 个人翻3倍,让次大的 y y y 个人翻2倍。
剩下的人,只有当 m < = 1 m<=1 m<=1 不被开除时才会被算到。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const long long MOD=1000000007;
long long n,m,x,y,ans;
long long a[1000010];
bool cmp(long long a,long long b)
{
	return a>b;
}
long long poww(long long x,long long y)    //快速幂优化时间复杂度,可达到 O(n)
{
    long long ans=1;
    while(y!=0)
     {
        if(y&1)
		  ans=ans*x%MOD;
        x=(x*x)%MOD;
        y>>=1;
     }
    return ans;
}
int main()
{
	cin>>n>>m>>x>>y;
	for(int i=1; i<=n; i++)
	   scanf("%lld",&a[i]);
	sort(a+1,a+1+n,cmp);
	if(m<=1)
	 {
	 	for(int i=x+y+1; i<=n; i++)
	 	   ans+=a[i];
	 }
	int tim=poww(3,m);
	int timm=poww(2,m);
	for(int j=1; j<=x; j++)
	   ans=(ans+(a[j]*tim)%MOD)%MOD;
	for(int j=x+1; j<=x+y; j++)
	   ans=(ans+(a[j]*timm)%MOD)%MOD;
	cout<<ans;
	return 0;
}

T4

思路

将一个数字不变,其他数字乘 x,
等价于其他数字不变,这个数字除以 x,
其中 x 为这个数字的一个素因子。
题目等价于每次可以将一个数字除以 x(x为其素因子)
问多少次可以将所有数字全部变成一样的。
可得,我们将所有数字都变成他们的 gcd 就行了,
我们求出所有数字的 gcd,让所有数字都除以 gcd
然后再算出所有数字的素因子个数和即可。

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[1000010],yc[1000010];
int n,js,num;
int gcd(int x,int y)
{
	if(y==0)
	  return x;
	return gcd(y,x%y);
}
int main()
{
	cin>>n;
	scanf("%d",&a[1]);
	js=a[1];
	for(int i=2; i<=n; i++)
	 {
	 	scanf("%d",&a[i]);
	 	js=gcd(js,a[i]);
	 }
	for(int i=1; i<=n; i++)
	 {
	 	a[i]/=js;
	 	int aa=a[i];
	 	for(int f=2; f*f<=aa;)
	 	 {
	 	 	while(aa%f==0)
	 	 	  num++,aa/=f;
	 	 	f++;
		 }
		if(aa!=1)
		  num++;
	 }
	cout<<num;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值