【JZOJ4835】【GDOI2017模拟10.31】量化交易
生活随笔
收集整理的這篇文章主要介紹了
【JZOJ4835】【GDOI2017模拟10.31】量化交易
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
數據范圍
解法
貪心;
從左往右枚舉,設枚舉到元素為x,并維護一個堆:
設此時堆頂元素為y,
如果x大于y,那么x可以與y產生差價,立即將差價貢獻給答案。
如果y之前已經和其他元素z產生過差價了,那么y顯然可以省出來以得到最優答案,因為x-z=x-y+y-z;
否則,把y移出堆。
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define ll long long #define sqr(x) ((x)*(x)) #define ln(x,y) ll(log(x)/log(y)) using namespace std; const char* fin="trade.in"; const char* fout="trade.out"; const ll inf=0x7fffffff; const ll maxn=100008; ll n,i,j,k,v=0,ans,t; ll a[maxn],son[maxn]; struct dui{ll data[maxn],num;void init(){memset(data,0,sizeof(data));num=0;}dui(){init();}bool cmp(ll v,ll u){return a[v]<=a[u];}void up(ll x){while (x>1 && cmp(data[x],data[x/2])) swap(data[x],data[x/2]),x=x/2;}void down(ll x){while (x*2<=num && cmp(data[x*2],data[x]) || x*2+1<=num && cmp(data[x*2+1],data[x])){if (x*2+1>num || cmp(data[x*2],data[x*2+1])){swap(data[x],data[x*2]);x=x*2;}else{swap(data[x],data[x*2+1]);x=x*2+1;}}}void push(ll v){data[++num]=v;up(num);}void pull(){swap(data[1],data[num--]);down(1);}ll top(){if (num) return data[1];else return 0;} }d; ll read(){ll x=0,y=0;char ch=getchar();while (ch<'0' || ch>'9') {ch=getchar();y++;if (y==10) return -1;}while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; } int main(){freopen(fin,"r",stdin);freopen(fout,"w",stdout);while (1){n=read();if (n==-1) break;ans=0;t++;d.init();for (i=1;i<=n;i++) a[i]=read();memset(son,0,sizeof(son));for (i=1;i<=n;i++){if (d.top()){j=d.top();if (a[i]>a[j]){ans+=a[i]-a[j];if (son[j]){son[j]=0;son[i]=j;}else {d.pull();son[i]=j;}}}d.push(i);}printf("Case #%lld: %lld\n",t,ans);}return 0; }啟發
有關策略的問題可以考慮貪心;
貪心正著推,可以使用數據結構幫助貪心找到更優的解。
轉載于:https://www.cnblogs.com/hiweibolu/p/6714859.html
總結
以上是生活随笔為你收集整理的【JZOJ4835】【GDOI2017模拟10.31】量化交易的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android WebView使用
- 下一篇: FragmentTabHost + Fr