推銷員【題目鏈結】
好了為了湊字數先把題目複製一下:
好了題解第一篇正解:
首先輸入,莫得什麼好說的:
scanf("然後是思路:%d",&n);
for (int i=1;i<=n;i++)
scanf("%d
",&a[i].s);
for (int i=1;i<=n;i++)
scanf("%d
",&a[i].v);
對於每乙個x,我們有兩種選擇:
①選擇前x個a值最大的;
②選擇前x-1個a值最大的,再在x~n中選擇乙個s[i]*2+a[i]最大的。
先按照a從大到小排序;
然後陣列q[i]記錄前i項的a的和;
for (int i=1;i<=n;i++)陣列h[i]記錄a[i]*2+s[i]後i項的最大值(也就是為了應對情況②)q[i]=q[i-1]+a[i].v;
for (int i=n;i>=1;i--)陣列qm[i]記錄前i項的s的最大值;h[i]=max(h[i+1],2*a[i].s+a[i].v);
for (int i=1;i<=n;i++)答案就是max(q[x]+2*qm[x],q[x-1]+h[x])qm[i]=max(qm[i-1],a[i].s);
對於為什麼只取乙個後i個,你想啊,只有最遠到達的地點的s會對最終答案產生影響,而且其實這裡q[x-1]+h[x]並不一定是實際答案,如果前x-1個中s有乙個sd大於我們h[i]中取的si,我們本應該用sd來計算答案,但這個題是用si來計算,這樣不會對真實的答案造成影響。
洛谷 P2672 推銷員
阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推銷產品,然...
洛谷 P2672 推銷員
題目描述 阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推...
洛谷 P2672 推銷員
阿明是一名推銷員,他奉命到螺絲街推銷他們公司的產品。螺絲街是一條死胡同,出口與入口是同乙個,街道的一側是圍牆,另一側是住戶。螺絲街一共有n家住戶,第i家住戶到入口的距離為si 公尺。由於同一棟房子裡可以有多家住戶,所以可能有多家住戶與入口的距離相等。阿明會從入口進入,依次向螺絲街的x家住戶推銷產品,...