模拟赛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
要多骗分