2021年3月30日百度笔试题
生活随笔
收集整理的這篇文章主要介紹了
2021年3月30日百度笔试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2021年3月30日 百度筆試編程題第二題
描述:
牛牛有一個硬幣,有p%的概率為正。現在要把一個數組 a[1]…a[2*n]拆分成n個二元組。對于這n個二元組,拋硬幣,如果是正面就選擇這兩個數里最大的數字,反之則選最小的數字。
求最終和的結果的最大值的期望
輸入:
第一行輸入一個 n,一個p
第二行2*n個數據
輸出:
如果是整數,則輸出整數,如果是小數,則輸出帶%的數據
貪心即可。很容易知道,如果p%<0.5那么肯定得小的和小的組合,大的和大的組合,如果p%>0.5 那么肯定得小的和大的組合,大的和小的組合。
所以,先進行排序,然后判斷p的大小,選擇組合即可。
but 這樣數據無法AC,應為數組的大小范圍是1–1e11 ;n的范圍是1–1e6,p的范圍是0-1e2,累乘后是1e19。 所以long long也會爆。處理方法是,在加的過程就除掉100,并記錄余數,最后進行總結即可
AC代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e6+10; ll n,p,a[maxn],ans=0,re=0; int main(){cin>>n>>p;for(ll i=1;i<=2*n;i++){cin>>a[i];}sort(a+1,a+1+2*n);if(p<=50){for(ll i=1;i<=2*n;i+=2){ll cnt=(p*a[i+1]+(100-p)*a[i]);ans+=cnt/100;re+=cnt%100;//記錄余數}}else{for(ll i=1;i<=n;i++){ll cnt=(p*a[2*n-i+1]+(100-p)*a[i]);ans+=cnt/100;re+=cnt%100;}}//總結if(re%100==0){//若余數的累加也是100的倍數,則答案肯定是個整數printf("%lld\n",ans+re/100);}else{//答案不是整數ans+=re/100;//ans加上缺省值re=re%100;//re對100取余printf("%lld%lld%\n",ans,re);//直接輸出即可}}第一題的連接
總結
以上是生活随笔為你收集整理的2021年3月30日百度笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js实现简易打点计时器
- 下一篇: 王道课后代码题