1. 程式人生 > >2018年12月29日普級組 解題報告

2018年12月29日普級組 解題報告

首先看第一題,比較明顯的模擬題,打了高精度,第二題暫時沒思路,先剛第三題,先想到dfsdfs求層數,發現可以直接用並查集搞搞,就過了,第四題沒思路,就碼了第四題,發現可以直接用桶排,過掉。第四題仔細分析發現和池塘釣魚很像,可是又不能表示狀態,明顯的貪心,直接用堆過。

T1 小XX的加法難題

大意

輸入aabb,輸出a+ba+b

思路

高精度 程式碼略

T2 小XX的密碼破譯

大意

di=ai2+bi+c(i=1..n)d_i=ai^2+bi+c(i=1..n)求去重後的i×di\prod i\times d_i

思路

桶排過掉 程式碼略

T3 小XX的液體混合

大意

nn個點,求22^{最深的點得深度}

思路

並查集 程式碼略

T4 小XX的 AK 計劃

大意

nn個點,到每個點的時間為xinow|x_i-now|,選擇其的時間為TiT_i,求最多可選擇則的點

思路

兩條基本思路:

  1. 首先往後走了就沒有必要往前走了
  2. 最後的落點必然是某個點的xix_i

根據這兩條基本思路,我們可以直接維護一個大根堆,判斷某個點是否能作為我最後落點並且比之前更優即可

程式碼

#include<queue>
#include
<cstdio>
#include<algorithm> using namespace std;long long n,m,ans,bh[100001],len,k=1,s; struct node{long long a,b;}a[100001]; inline bool cmp(node x,node y){return x.a<y.a;} priority_queue<int>q; signed main() { scanf("%lld%lld",&n,&m); for(register int i=1;i<=n;i++) scanf
("%lld%lld",&a[i].a,&a[i].b); sort(a+1,a+1+n,cmp); for(register int i=1;i<=n;i++) { if(ans+a[i].a+a[i].b>m&&i>1)//不能放了 { ans-=q.top();//把最大的弄掉 q.pop(); q.push(a[i].b);//放小的 } else { q.push(a[i].b);//能放就放 ans+=a[i].b;//加上 s++;//多Ak一道 } } printf("%d",s); }