A题 面试
思路:直接进行一个处理,先根据输入计算出四次机会下来获得的评级A,B,C,D的个数,然后根据题目的要求进行一个相应的处理即可。
代码:
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
void solve(){
int a=0,b=0,c=0,d=0;
char ch;
for(int i=0;i<4;i++){
cin>>ch;
if(ch=='A') a++;
if(ch=='B') b++;
if(ch=='C') c++;
if(ch=='D') d++;
}
if(d>0||c>=2){
cout<<"failed"<<endl;
return;
}
if(d==0&&a>=3){
cout<<"sp offer"<<endl;
return;
}
cout<<"offer"<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}B题 纸牌游戏
思路:思维分析题,我们知道,要尽量使最后的人数尽可能地少,首先对于每个人来说,它肯定是尽量使自己不被出局,然后又尽量使别人出局,为了使尽可能多的人出局,我们可以考虑让大家先拿那个最可能出局的人的牌,但是,谁是最可能出局的人呢?显然,如果对于一个人x,除x之外的场上剩余的人都拿它的牌的话,那它一轮先来牌数肯定是a[x]-场上剩余的人,如果做差下来为负数的话,那么它肯定会在某一回合出局,于是,我们就知道了一个贪心的思路,我们先对每个人拿的牌数做升序处理,如果此时场上的人数(除这个人外)比它能取得牌数多得话,那么它肯定会被出局,否则的话,这个就会一直无限进行下去,我们此时直接输出即可。
代码:
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
typedef long long ll;
int a[100010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i]>=n-i){
cout<<n-i+1<<endl;
return 0;
}
}
return 0;
}C题 涨薪
思路:这题做对完全自己都没想到,以为只能拿一半的分,误打误撞就做对了。其实思路很简单,我们非情况进行他讨论即可。首先,为了使最后的结果尽可能地大,我们先对每个人地初始工资进行一个降序排序,我们肯定是先考虑把x个A级分给前x工资高地人,把y个B分给x后面y个工资高的人,然后根据年份进行一个递增即可,这里你会发现是一个快速幂的思想,直接写个快速幂即可。最后我们对m进行一个分类讨论,也就是年份进行分类,如果m=1时,我们要对前x+y后剩余的人加上工资,当m>1时,我们就可以直接不算这些人的工资了(因为他们离职了),最后就可以累加得到答案。
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int a[100010];
ll quickpow(ll x,ll y){
if(y==0) return 1;
else{
if(y&1) return x*quickpow(x,y-1)%mod;
else{
ll mul=quickpow(x,y/2)%mod;
return mul*mul%mod;
}
}
}
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,m,x,y;
cin>>n>>m>>x>>y;
ll sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+1+n,cmp);
int z=n-x-y;
if(x==0&&y==0){
if(m>1) cout<<"0"<<endl;
else cout<<sum<<endl;
return 0;
}
ll sum1=0,sum2=0;
for(int i=1;i<=x;i++){
sum1+=a[i];
}
for(int i=x+1;i<=x+y;i++){
sum2+=a[i];
}
if(m==1){
sum1=sum1*3;
sum2=sum2*2;
ll ans=(sum1+sum2)%mod;
for(int i=x+y+1;i<=n;i++){
ans+=a[i];
}
cout<<ans%mod<<endl;
return 0;
}
ll ans1=sum1*quickpow(3,m)%mod;
ll ans2=sum2*quickpow(2,m)%mod;
ll ans=(ans1+ans2)%mod;
cout<<ans<<endl;
return 0;
}
京公网安备 11010502036488号