热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:noip2005提高组题解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了noip2005提高组题解相关的知识,希望对你有一定的参考价值。水正经题解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了noip2005提高组 题解相关的知识,希望对你有一定的参考价值。



正经题解




最多的奖学金


https://www.luogu.com.cn/problem/P1051

就水题,但我还是wa了一个点[??]

大概就是排序的时候把“>"换成 "<"就过了,应该是输出时优先输出排前面的[无可奈何]

代码就不贴了

 




过河


https://www.luogu.com.cn/problem/P1052

这道题状态转移方程很显然。

f[i]表示到第i个点经过的最少石子数f[i]=min(f[i],f[i-j]+a[i]);j取s~t,a[i]表示当前点是否有石子。

f注意要取到l+t

因为可以直接跳过第l个点。如果第l个点为石子的话,会对结果产生影响。


但是!!

这道题的范围很大 109,直接dp肯定会爆掉。

所以就有个小优化。(听说叫什么离散化?我也不知道)

考虑到虽然l范围很大,但题目给的m只有100,s、t都不大于10。很显然:

一定有至少两个石子隔得很远,中间都是可以随便跳的,对我们求石子的结果是没有影响的。

所以,我们只需要把隔得很远的石子中间路程减掉,就可以大大的优化了。

至于怎么减掉。考虑到s、t处于1到10之间,可以剪掉而对结果无影响的,就是s、t的倍数,取模就行了。

于是,2520这个神奇的数字就出现啦!(1~10的最小公倍数 我一开始就是这里搞错了)。

附上代码

 


#include
using namespace std;
int a[105],d[105],st[500000];
int f[500000];
int main()
{
// freopen("river.in","r",stdin);
// freopen("river.out","w",stdout);
int l,s,t,m;
cin>>l>>s>>t>>m;
for(int i=1;i<=m;i++)
cin>>a[i];
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)
d[i]=(a[i]-a[i-1])%2520;
for (int i=1;i<=m;i++)
{
a[i]=a[i-1]+d[i];
st[a[i]]=1;
}
l=a[m];
for(int i=0;i<=l+t;i++) f[i]=m;
f[0]=0;
for(int i=1;i<=l+t;i++)
{
for(int j=s;j<=t;j++)
{
if(i-j>=0)
f[i]=min(f[i],f[i-j]);
f[i]+=st[i];
}
}
int ans=m;
for(int i=l;i ans=min(ans,f[i]);
cout< return 0;
}




篝火晚会


https://www.luogu.com.cn/problem/P1053

这道题乍一看无从下手,但是仔细多品味一下,会发现就题目意思比较坑而已。

本质模拟?

就判断一下左右两边能否和谐地安排好同一个人,然后再从正反两种顺序判断是不是已经达到目标状态,再输出所需步数更小的那个

为什么要正反都判断呢?大概是因为它是个圈?[muji]

直接贴代码吧

 


#include
using namespace std;
const int N=50005;
int l[N],r[N],a[N],b[N],c[N];
bool vis[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&l[i],&r[i]);
a[1]=1,a[2]=l[1];
for(int i=2;i<=n;i++)
{
if(a[i-1]==l[a[i]]) a[i+1]=r[a[i]];
else if(a[i-1]==r[a[i]]) a[i+1]=l[a[i]];
else
{
cout<<-1;
return 0;
}
}
for(int i=1;i<=n;i++)
{
b[(a[i]-i+n)%n]++;
c[(a[n-i+1]-i+n)%n]++;
}
int ans=0;
for(int i=0;i ans=max(ans,max(b[i],c[i]));
cout< return 0;
}

 




等价表达式


https://www.luogu.com.cn/problem/P1054

就是栈的一个应用 两个栈 一个保存符号,一个保存数字。

如果当前运算符优先级小于栈顶的,就进行一次运算。结果入栈。知道大于等于了。

如果是"("就直接入栈好了,直到碰到一个‘‘)‘‘。

这道题我最纠结的是a怎么处理。其实用一个质数的话就没太大问题了(当然如果一定要用2这种素数的话呢也是无可奈何的)。

没有附代码的原因绝对不是因为我还没有打完……我真的没打完,它看着容易,其实很难打的。

求放过[诚恳]。




磨磨蹭蹭一晚上,在电脑重启两次的情况下我终于写完啦!!

第一篇博客,贴上轰总照片纪念一下吧 不是私欲

技术图片


推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有