题号 | 题目 |
---|---|
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
Q−1,
那么他们每个人都可以从其他所有人手中拿一张牌,游戏可以无限的进行下去。
反之,若其中至少有一个人的
a
i
a_i
ai 小于
Q
−
1
Q-1
Q−1,
那么其他人可以一起拿他的牌,一轮下来他就会减少
Q
−
1
Q-1
Q−1 张牌,
而他又只能补充
a
i
<
Q
−
1
a_i < Q-1
ai<Q−1 张牌,
几个回合之后他就会被淘汰出局。
根据上述结论,先对 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
n−x−y 个人,
我们压根不用管它,因为这一定不是最优的;
所以我们只需要对初始工资排序,让最大的
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;
}