Java的String類,清楚了嗎?
阿新 • • 發佈:2021-10-15
如果真的要列舉,排序暴力硬做的話肯定會掛掉
那麼就是要優化的,顯然劃分一個2c的序列,答案不回比劃分兩個c的更優
可以畫個圖證明一下
而劃分成小於c的序列,就相當於劃分成一堆1的序列
劃分成c-2c的序列呢?顯然是不如劃分成c和另外一個,肯定不會更差
這樣的話就檢查劃分成c和1就可以解決了
#include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #include<queue> #define int long long using namespace std; template<class T>inline void read(T &x) { x=0;register char c=getchar();register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); if(f)x=-x; } template<class T>inline void print(T x) { if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar('0'+x%10); } int n,c; int a[10000001]; deque<int> q; int mi[1000001]; int f[1000001]; int sum[1000001]; signed main(){ read(n);read(c); for(int i=1;i<=n;++i){ read(a[i]); sum[i]=sum[i-1]+a[i]; } memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;++i){ while(!q.empty()&&q.front()+c<=i){ q.pop_front(); } while(!q.empty()&&a[q.back()]>=a[i]){ q.pop_back(); } q.push_back(i); mi[i]=a[q.front()]; } f[0]=0; for(int i=1;i<=n;++i){ f[i]=f[i-1]+a[i]; if(i>=c){ f[i]=min(f[i],f[i-c]+sum[i]-sum[i-c]-mi[i]); } } cout<<f[n]; return 0; }