【计蒜客信息学模拟赛1月月赛 - B】蒜头套圈圈(贪心,前缀最大值)
題干:
蒜頭去嘉年華玩兒套圈圈,是這么玩兒的。有一些瓶口口徑不同的啤酒瓶,瓶子里面有一些獎品。如果蒜頭用手上的圈圈套中了啤酒瓶,那么獎品就歸他了。
假設蒜頭君無限精準,指哪兒打哪兒,并且蒜頭了解到,只有圈圈的半徑 嚴格大于 啤酒瓶半徑,才能套中。
并且蒜頭君知道自己手上的每個圈圈的半徑,也知道每個啤酒瓶的半徑和里面物品相對應的價值。
當然,獎品是無限多的,意思就是如果蒜頭君套中了一個啤酒瓶并且獲得了獎品,下次可以繼續套獲得同樣的獎品。
現在蒜頭君想問你,他最大能獲得多少價值。
輸入格式
第一行兩個整數?NN,MM?代表圈圈的個數和啤酒瓶的個數。
第二行?NN?個整數代表圈圈的半徑?r_crc?。
接下來?MM?行每行兩個整數?r_brb?,vv?代表啤酒瓶的半徑?rr?和相應的價值?vv。
輸出格式
輸出一個整數,代表蒜頭能獲得的最大價值。
數據范圍
對于?30\%30%?的數據:N = 1N=1?,?M = 1M=1?,?1 \le r_c , r_b , v \le 1001≤rc?,rb?,v≤100?。
對于?60\%60%?的數據:1 \le N \times M \le 10000001≤N×M≤1000000,?1 \le r_c , r_b , v \le 1001≤rc?,rb?,v≤100?, 保證所有的價值?vv?都相等。
對于?100\%100%?的數據:1 \le N \times M \le 10000001≤N×M≤1000000,?1 \le r_c , r_b , v \le 1001≤rc?,rb?,v≤100。
輸出時每行末尾的多余空格,不影響答案正確性
樣例輸入復制
2 2 2 3 1 2 2 3樣例輸出復制
5解題報告:
? ?但是不知道為啥,這個AC代碼1竟讓比代碼2要慢。。。這個AC代碼1幾乎是線性的啊。(應該說明有極端數據n=1e6,m=1這樣的,就把nlogn給卡了)
AC代碼1:(復雜度O(nlogn+mlogm+n+m),109ms)
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e6 + 5; typedef pair<ll,ll > PLL; ll R[MAX],r[MAX],v[MAX]; PLL p[MAX]; int main() {int n,m;cin>>n>>m;for(int i = 1; i<=n; i++) scanf("%lld",R+i);for(int i = 1; i<=m; i++) scanf("%lld%lld",&p[i].first,&p[i].second);sort(R+1,R+n+1);sort(p+1,p+m+1);ll ans = 0,maxx = 0,j=1;for(int i = 1; i<=n; i++) {while(R[i] > p[j].first && j<=m) maxx = max(maxx,p[j].second),j++;ans += maxx;} printf("%lld\n",ans);return 0 ;}AC代碼2:(復雜度O(n*m),66ms)
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e6 + 5; ll R[MAX],r[MAX],v[MAX]; int main() {int n,m;cin>>n>>m;for(int i = 1; i<=n; i++) scanf("%lld",R+i);for(int i = 1; i<=m; i++) scanf("%lld%lld",r+i,v+i);ll ans = 0,maxx = 0;for(int i = 1; i<=n; i++) {maxx = 0;for(int j = 1; j<=m; j++) {if(R[i] > r[j]) maxx = max(maxx,v[j]);}ans += maxx;} printf("%lld\n",ans);return 0 ;}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【计蒜客信息学模拟赛1月月赛 - B】蒜头套圈圈(贪心,前缀最大值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10099!中国广电官网正式上线:开启选
- 下一篇: 【2019浙江省赛 - K 】Strin