首页 > 其他 > 详细

【宁波市第23届中小学生计算机程序设计竞赛(初中组)T2】宝石(贪心)

时间:2018-07-26 23:21:04      阅读:265      评论:0      收藏:0      [点我收藏+]

题目描述

见上帝动了侧隐之心,天后也想显示一下慈悲之怀,随即从身上解下腰带,让身边的美神维纳斯拿到固天圈上去试试,如果腰带触碰到固天圈上镶嵌着的连续的宝石,就将这些宝石送给人们。维纳斯想让腰带触碰到更多的宝石,可要在短短的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】宝石(贪心)

原文:https://www.cnblogs.com/gzh01/p/9374784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!