宁波市第23届中小学生计算机程序设计竞赛(初中组)T2宝石(贪心)
Posted gzh01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了宁波市第23届中小学生计算机程序设计竞赛(初中组)T2宝石(贪心)相关的知识,希望对你有一定的参考价值。
题目描述
见上帝动了侧隐之心,天后也想显示一下慈悲之怀,随即从身上解下腰带,让身边的美神维纳斯拿到固天圈上去试试,如果腰带触碰到固天圈上镶嵌着的连续的宝石,就将这些宝石送给人们。维纳斯想让腰带触碰到更多的宝石,可要在短短的1秒钟之内解决问题,也感到力不从心,你能帮帮她吗?
固天圈上按顺时针方向标有1、2、……、t共t个点,当然第t点顺时针方向的下一个点是第1点。相邻两点之间的距离均为1厘米。
在这t个点中有n个点处镶嵌有宝石,每个宝石均有一定的价值。以长度为k厘米的腰带覆盖至固天圈上,怎样才能获得最多价值的宝石呢?
固天圈上按顺时针方向标有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的正整数,表示对应位置上宝石的价值,互相之间用一个空格分隔。
第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宝石(贪心)的主要内容,如果未能解决你的问题,请参考以下文章
2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题
2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题
2021第7届中国大学生程序设计竞赛CCPC桂林站, 签到题5题
2021第7届中国大学生程序设计竞赛CCPC桂林站, 签到题5题