日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

牛客网【每日一题】3月25日 tokitsukaze and Soldier

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客网【每日一题】3月25日 tokitsukaze and Soldier 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

牛客網【每日一題】3月25

題號:NC50439
名稱: tokitsukaze and Soldier
來源:練習賽50-C
鏈接: link.

來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 524288K,其他語言1048576K
64bit IO Format: %lld
題目描述
在一個游戲中,tokitsukaze需要在n個士兵中選出一些士兵組成一個團去打副本。
第i個士兵的戰力為v[i],團的戰力是團內所有士兵的戰力之和。
但是這些士兵有特殊的要求:如果選了第i個士兵,這個士兵希望團的人數不超過s[i]。(如果不選第i個士兵,就沒有這個限制。)
tokitsukaze想知道,團的戰力最大為多少。
輸入描述:

第一行包含一個正整數n(1≤n≤10^5)。
接下來n行,每行包括2個正整數v,s(1≤v≤10^9,1≤s≤n)。

輸出描述:

輸出一個正整數,表示團的最大戰力。

示例1
輸入

2 1 2 2 2

輸出

3

示例2
輸入

3 1 3 2 3 100 1

輸出

100

思路
所求的最大戰斗力由v和s這兩個因素限制。
結構體數組a存放v和s,然后對其排序,先按照s從大到小,如果s相同再排v,也是從大到小(先要保證足夠的人數,后面好進行取舍)。
定義一個從小到大的優先隊列q,ans相互跟隨q,(q每次添加一個戰力值,同時用ans加上戰力值;ans刪去,q也彈出),戰力值的先后加入由s的排序決定,當q的元素數量大于當前s的值時(s是由大到小的排序的),就將多出的部分pop出(q是從小到大排序,所以彈出的總是其中最小值),再用ans減去,這樣ans的值即為在人數限定在s內的最佳情況(因為彈出的是最小值,相對于前s個數的和,所以之后也不用再考慮被彈出的數),記錄ans的最大值
我剛開始提交是70多分,想了一陣子才發現是數組開小了(笑哭)

#include<map> #include<queue> #include<bits/stdc++.h> #define maxn 100004 using namespace std; struct node{long long int v,s; }; node a[maxn]; bool cmp(node a,node b) {if(a.s!=b.s)return a.s>b.s;else return a.v>a.v; } int main() {int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i].v>>a[i].s;}sort (a+1,a+1+n,cmp); // int tot=0;long long int ans=0;int minn=maxn;long long int maxx=0;priority_queue<int,vector<int>,greater<int> >q;for(int i=1;i<=n;i++){q.push(a[i].v);ans+=a[i].v;while(q.size()>a[i].s){ans-=q.top(); // printf("q.size=%d,a[i].s=%d,ans=%d\n",q.size(),a[i].s,ans);q.pop(); // tot--;}if(ans>maxx)maxx=ans;}cout<<maxx;return 0; }

總結

以上是生活随笔為你收集整理的牛客网【每日一题】3月25日 tokitsukaze and Soldier的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。