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;
}