1. 程式人生 > >【寧波市第23屆中小學生計算機程序設計競賽(初中組)T2】寶石(貪心)

【寧波市第23屆中小學生計算機程序設計競賽(初中組)T2】寶石(貪心)

寧波 連續 更多 超過 如果 span 輸出 數組 for

題目描述

見上帝動了側隱之心,天後也想顯示一下慈悲之懷,隨即從身上解下腰帶,讓身邊的美神維納斯拿到固天圈上去試試,如果腰帶觸碰到固天圈上鑲嵌著的連續的寶石,就將這些寶石送給人們。維納斯想讓腰帶觸碰到更多的寶石,可要在短短的1秒鐘之內解決問題,也感到力不從心,你能幫幫她嗎?
固天圈上按順時針方向標有1、2、……、t共t個點,當然第t點順時針方向的下一個點是第1點。相鄰兩點之間的距離均為1厘米。
在這t個點中有n個點處鑲嵌有寶石,每個寶石均有一定的價值。以長度為k厘米的腰帶覆蓋至固天圈上,怎樣才能獲得最多價值的寶石呢?

輸入

輸入文件gem.in 有三行:
第1行有三個正整數n、t、k(互相之間用一個空格分隔),表示有n個位置上有寶石,固天圈上的最大標號為t,腰帶長度為k厘米。
第2行有n個不超過t的正整數,表示鑲嵌著的寶石的位置,互相之間用一個空格分隔。
第3行有n個不超過10000的正整數,表示對應位置上寶石的價值,互相之間用一個空格分隔。

輸出

輸出文件gem.out只有一個正整數,為腰帶能觸碰到的寶石價值和的最大值。

雖然是環,我們只需要把數組復制多一遍即可。每一次價值和加到最遠能獲得的寶石,時間復雜度O(N^2),常數小不會爆。

 1 #include <algorithm>
 2 #include <cstdio>
 3  
 4 struct jer{
 5     int l,v;
 6 }a[200002];
 7  
 8 int n,t,k,ans;
 9 #define max(x,y) (x>y?x:y)
10  
11 bool cmp(jer x,jer y){
12     return
x.l<y.l; 13 } 14 15 int main(void){ 16 scanf("%d%d%d",&n,&t,&k); 17 for(int i=1;i<=n;++i) 18 scanf("%d",&a[i].l); 19 for(int i=1;i<=n;++i) 20 scanf("%d",&a[i].v); 21 std::sort(a+1,a+n+1,cmp); 22 for(int i=1;i<=n;++i){ 23 a[i+n].l=a[i].l+t;
24 a[i+n].v=a[i].v; 25 } 26 for(int i=1;i<=n;++i){ 27 int tot=a[i].v; 28 int j=i+1; 29 while(a[j].l-a[i].l<=k){ 30 tot+=a[j].v; 31 ++j; 32 } 33 ans=max(ans,tot); 34 } 35 printf("%d",ans); 36 }

【寧波市第23屆中小學生計算機程序設計競賽(初中組)T2】寶石(貪心)