1. 程式人生 > 實用技巧 >3,harbor 的https 安裝部署

3,harbor 的https 安裝部署

D. Boboniu Chats with Du

原題連結:

https://codeforces.ml/contest/1395/problem/D

題目大意:

在qq聊天中Du有$n$句話,每句話有不同的數值,一天只能說一句話,如果高於$m$的話就會在之後被禁言$d$天。要求出Du可以得到的最大值。

解題思路:

將$n$句話分成兩部分,一部分是小於m的,另一部分是大於m的。首先將這兩部分分別排序(從大到小),然後計算字首和。接著可以列舉說的話小於m的個數i,如果$(n- i )%(d + 1)$則可以取$(n- i )/(d + 1)$,否則可以取$(n- i )/(d + 1)+1$個。然後求出最大值即可。

程式碼:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef pair<ll,ll> pi;
 5 typedef complex <double> cp;
 6 #define debug(a) cout<<#a<<":"<<a<<endl;
 7 #define fr freopen("in.txt","r",stdin);
 8 #define Fill(x,a) memset(x,a,sizeof(x))
 9
#define cpy(a,b) memcpy(a,b,sizeof(a)) 10 const double PI = acos(-1); 11 const ll INF=0x3f3f3f3f; 12 const ll N=1e6+7; 13 const ll mod=1e9+7; 14 ll maxn,minn; 15 ll T,n,m,q,d; 16 ll a[N]; 17 ll b[N]; 18 ll arr[N]; 19 ll aa,bb; 20 ll dpa[N]; 21 ll dpb[N]; 22 23 int main(){ 24 cin>>n>>d>>m;
25 aa=bb=0; 26 for(ll i=1;i<=n;i++){ 27 scanf("%lld",arr+i); 28 if(arr[i]>m){ 29 b[++bb]=arr[i]; 30 } 31 else{ 32 a[++aa]=arr[i]; 33 } 34 } 35 sort(a+1,a+aa+1); 36 sort(b+1,b+bb+1); 37 reverse(a+1,a+aa+1); 38 reverse(b+1,b+bb+1); 39 maxn=0; 40 Fill(dpa,0); 41 Fill(dpb,0); 42 for(ll i=1;i<=n;i++){ 43 dpa[i]=dpa[i-1]+a[i]; 44 } 45 for(ll i=1;i<=n;i++){ 46 dpb[i]=dpb[i-1]+b[i]; 47 } 48 for(ll i=0;i<=aa;i++){ 49 int j; 50 if((n-i)%(d+1)==0){ 51 j=(n-i)/(d+1); 52 } 53 else{ 54 j=(n-i)/(d+1)+1; 55 } 56 maxn=max(maxn,dpa[i]+dpb[j]); 57 } 58 cout<<maxn<<endl; 59 60 return 0; 61 } 62 63