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