模拟赛2

1.面试

解题思路

纯模拟,十分暴力

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
string s;
int T,a[4];
int main()
{
   
	scanf("%d",&T);
	for(int i=1;i<=T;i++)//模拟
	{
   
		cin>>s;
		a[0]=a[1]=a[2]=a[3]=0;//初值
		for(int j=0;j<4;j++)a[s[j]-'A']++;//累加
		if(a[3]>0||a[2]>1)printf("failed\n");//判断
		else if(a[0]>2)printf("sp offer\n");
		else printf("offer\n"); 
	}
	return 0;
}

2.纸牌游戏

解题思路

题目中交代每个人希望有尽多的人会出局,所以可以想到每个人都会拿每回合增长数最小的那个人的牌,因为所有人的初始手牌都是相同的,增长数最少的人便是最容易出局的

这时我们可以想到首先按照每回合拿牌数量进行一次排序
每个人的位置为i(1<=i<=n),那么当所有人优先拿他的牌的时候,证明他的左侧已经没有其他人了,所以他每回合会被剩下的n-i个人拿走n-i张纸牌
这时分两种情况

1.如果ai>=n-i,那么他每回合可以从剩下n-i个人手里拿n-i张牌,成为平衡状态,游戏可以持续进行,则最小剩余人数就是n-i+1
2.如果ai<n-i,那么他每回合失去的牌要大于能拿回的牌,必定会出局,此时判断第i+1个数。

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,j,a[100005];
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){
   j=n-i+1;break;}//核心思路,上面讲了
	printf("%d",j);
	return 0;
} 

3. 涨薪

解题思路

快速幂求次方
其他都模拟

AC代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long

using namespace std;

const int tjh = 1e9 + 7;
int n, m, X, Y, suma, sumb;
int a[100005];

bool cmp(int x, int y)
{
   return x > y;}

int ksm(int x, int p)//快速幂
{
   
	int ans = 1;
	x %= tjh;
	while(p)
	{
   
		if (p & 1) ans = (ll)ans * x % tjh; 
		x = (ll)x * x % tjh;
		p >>= 1;
	}
	return ans % tjh;
}

int main()
{
   
	scanf("%d%d%d%d", &n, &m, &X, &Y);
	int w1 = ksm(3, m);
	int w2 = ksm(2, m);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	sort(a + 1, a + n + 1, cmp);//排序
	for (int i = 1; i <= X; ++i)//模拟
		suma = (suma + a[i]) % tjh;
	for (int j = X + 1; j <= X + Y; ++j)
		sumb = (sumb + a[j]) % tjh;
	int ansx = (((ll)suma * w1) % tjh + ((ll)sumb * w2) % tjh) % tjh;
	if (m == 1) 
		for (int i = X + Y + 1; i <= n; ++i)
			ansx = (ansx + a[i]) % tjh;
	printf("%d", ansx);
	return 0;
}

4.变换

由于本人太蒟,就奉上其他人的题解





总结

考试
预估:100+100+0+0=200
实际:100+100+20+0=220
要多骗分

谢谢