2018年12月29日普級組 解題報告
阿新 • • 發佈:2018-12-18
首先看第一題,比較明顯的模擬題,打了高精度,第二題暫時沒思路,先剛第三題,先想到求層數,發現可以直接用並查集搞搞,就過了,第四題沒思路,就碼了第四題,發現可以直接用桶排,過掉。第四題仔細分析發現和池塘釣魚很像,可是又不能表示狀態,明顯的貪心,直接用堆過。
T1 小的加法難題
大意
輸入和,輸出
思路
高精度
程式碼略
T2 小的密碼破譯
大意
設求去重後的
思路
桶排過掉
程式碼略
T3 小的液體混合
大意
有個點,求
思路
並查集
程式碼略
T4 小的 AK 計劃
大意
有個點,到每個點的時間為,選擇其的時間為,求最多可選擇則的點
思路
兩條基本思路:
- 首先往後走了就沒有必要往前走了
- 最後的落點必然是某個點的
根據這兩條基本思路,我們可以直接維護一個大根堆,判斷某個點是否能作為我最後落點並且比之前更優即可
程式碼
#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);
}