传送门

考查题型 dp 模拟 贪心

T1

谁拿了最多的奖学金

题目描述

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

输入输出格式

输入格式:

输入文件scholar.in的第一行是一个整数N(1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

输出格式:

输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

输入输出样例

输入样例#1:

4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
输出样例#1:

ChenRuiyi
9000
28700

说明

2005提高组第一题

题解

模拟

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std; int n,ans;
struct P{
string name;int id;
int qm,bj;char gb,xb;
int lw,jxj;
}stu[]; bool cmp(P a,P b){
if(a.jxj!=b.jxj)return a.jxj>b.jxj;
return a.id<b.id;
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
cin>>stu[i].name>>stu[i].qm>>stu[i].bj>>stu[i].gb>>stu[i].xb>>stu[i].lw;
stu[i].id=i;
// cout<<stu[i].name<<" "<<stu[i].qm<<" "<<stu[i].bj<<" "<<stu[i].gb<<" "<<stu[i].xb<<" "<<stu[i].lw<<endl;;
if(stu[i].qm>&&stu[i].lw>=)stu[i].jxj+=;
if(stu[i].qm>&&stu[i].bj>)stu[i].jxj+=;
if(stu[i].qm>)stu[i].jxj+=;
if(stu[i].qm>&&stu[i].xb=='Y')stu[i].jxj+=;
if(stu[i].bj>&&stu[i].gb=='Y')stu[i].jxj+=;
ans+=stu[i].jxj;
}
sort(stu+,stu+n+,cmp);
cout<<stu[].name<<endl;
cout<<stu[].jxj<<endl;
cout<<ans<<endl;
return ;
}

T2 

过河

题目描述

在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

输入输出格式

输入格式:

输入文件river.in的第一行有一个正整数L(1 <= L <= 10^9),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。


输出格式:

输出文件river.out只包括一个整数,表示青蛙过河最少需要踩到的石子数。

输入输出样例

输入样例#1:

10
2 3 5
2 3 5 6 7
输出样例#1:

2

说明

对于30%的数据,L \le 10000L≤10000;

对于全部的数据,L \le 10^9L≤10​9​​。

2005提高组第二题

 题解

dp 注意压缩路径 至于为什么mod那个数我也不知道

网上有人证距离大于81的时候任何一个点都能跳到,不过也可以模所有可能跳的

长度的最小公倍数 这个是好理解的

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int ll,s,t,m,d[],pos[],f[],stone[];
int ans=;
int main(){
scanf("%d",&ll);
scanf("%d%d%d",&s,&t,&m);
for(int i=;i<=m;i++)scanf("%d",&pos[i]);
sort(pos+,pos+m+);
if(s==t){ans=;
for(int i=;i<=m;i++)if(pos[i]%s==)ans++;
cout<<ans<<endl;
return ;
}
for(int i=;i<=m;i++)if(pos[i]-pos[i-]>){
d[i]=(pos[i]-pos[i-])%;
}else d[i]=pos[i]-pos[i-];
for(int i=;i<=m;i++)pos[i]=pos[i-]+d[i],stone[pos[i]]++;ll=pos[m];
for(int i=;i<=ll+t;i++)f[i]=m;
for(int i=;i<=ll+t;i++){
for(int j=s;j<=t;j++){
if(i-j>=)f[i]=min(f[i],f[i-j]);
}f[i]+=stone[i];
}
for(int i=ll;i<=ll+t;i++)ans=min(ans,f[i]);
printf("%d\n",ans);
return ;
}

T3

篝火晚会

题目描述

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,……,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。

佳佳可向同学们下达命令,每一个命令的形式如下:

(b1, b2,... bm -1, bm)

这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2,…… bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,……,要求bm换到b1的位置上。执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?

输入输出格式

输入格式:

输入文件fire.in的第一行是一个整数n(3 <= n <= 50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。

输出格式:

输出文件fire.out包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。

输入输出样例

输入样例#1:

4

3 4

4 3

1 2

1 2
输出样例#1:

2

说明

对于30%的数据,n <= 1000;

对于全部的数据,n <= 50000。

2005提高组第三题

 题解

woc神题 做了好久...

主要做法应该是贪心+乱搞....

首先题目一定要读好啊,是任意m个点进行环形交换位置。所以1个点

交换位置的代价是1。我们可以构造出满足要求的环,然后让那些已经在

他本应该的位置上的那些人就不要动了,把那些不满足的从之前一堆人进

行调换。这是我们的问题就变成了两个环,一个为一开始的坐法,一个是

满足要求的做法怎样让这两个链镶嵌之后相同位置元素相同的个数最多呢

不能摁着一个另一个转吧,正解是转x个格到自己应该在的位置的人,它转

的格子是相同的....看代码...

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; int n,ans=1e9,a[],b[],f[],t[]; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
t[]=;t[]=a[];
for(int i=;i<n;i++)
if(t[i-]==a[t[i]])t[i+]=b[t[i]];
else if(t[i-]==b[t[i]])t[i+]=a[t[i]];
else {printf("-1");return ;}
for(int i=;i<=n;i++)
f[(t[i]-i)>=?(t[i]-i):(t[i]+n-i)]++;
for(int i=;i<=n;i++)ans=min(ans,n-f[i]);
memset(t,,sizeof(t));memset(f,,sizeof(f));
t[]=;t[]=b[];
for(int i=;i<n;i++)
if(t[i-]==b[t[i]])t[i+]=a[t[i]];
else if(t[i-]==a[t[i]])t[i+]=b[t[i]];
for(int i=;i<=n;i++)
f[(t[i]-i)>?(t[i]-i):(t[i]+n-i)]++;
for(int i=;i<=n;i++)
ans=min(ans,n-f[i]);
printf("%d\n",ans);
return ;
}

T4。。。。没做完...orz

NOIP2005题解的更多相关文章

  1. [题解]某模拟题(USACO月赛部分题+noip2005部分题)

    题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1..1000的范围内.拖拉 ...

  2. Noip2005谁拿了最多的奖学金题解

    题解 题目本身没什么好说的. 只是一道普及组的题让我领悟到scanf()读字符的真谛.scanf()函数最奇异的功能就是控制串里除格式化字符串之外的字符.若匹配成功则舍去. 所以我们能够"精 ...

  3. noip2005提高组题解

    05年的题目绝对是自2000年以来难度最大的.后三题的难度系数分别为0.2.0.2.0.3,而前面几年的题目中每年最多只出现一道难度系数为0.2的题目,其难度可见一斑. 强烈推荐这个 PPT,每道题都 ...

  4. 题解【洛谷P1046】[NOIP2005普及组] 陶陶摘苹果

    [NOIP2005] 陶陶摘苹果 首先,我们用一个数组s[11]存储每个苹果的高度. 然后,用a表示陶陶的身高. 接着,用a+30与s[i]比较,大于则计数器加一. 最后,输出计数器的值即可. #in ...

  5. [codevs1105][COJ0183][NOIP2005]过河

    [codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青 ...

  6. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  7. 历年NOIP选题题解汇总

    联赛前上vijos板刷往年联赛题,使用在线编辑编写代码,祝我rp++. 废话不多说,挑比较有意思的记一下. 题目是按照年份排序的,最早只到了03年. 有些题目因为 我还没写/很早之前写的忘了 所以就没 ...

  8. >题解< 校门外的树

    题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米.我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置:数轴上的每个整数点,即 0,1 ...

  9. 动态规划 洛谷P1048 [NOIP2005 普及组] 采药

    洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...

随机推荐

  1. centos 关于防火墙的命令

    CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...

  2. webstorm(三):webstorm的一些waring提示

    一.Attribute key is not allowed here 二.Comparison this.loginType != 'username' may cause unexpected t ...

  3. Wormholes(spfa判负环)

      POJ - 3259—— Wormholes Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & % ...

  4. 解决Eclipse中SVN版本信息不显示的问题

    eclipse  中使用 svn 插件,原本正常,未作任何更改,最近几天突然eclipse 中查看文件时,文件后面的 版本号 . 文件的状态图标 等等都不见了.以为有插件冲突,卸载了好多其他的相关的插 ...

  5. 12/10 C语言程序设计竞赛 后五题

    Title(题目) 小朋友顺逆报数 Problem ID(题目编号) (题目添加成功后由系统自动生成) Time Limit(运行时间限制) S(秒) Memory Limit(内存限制) MByte ...

  6. js如何获取table或者ul中鼠标点的行号和内容

    <html> <head> <script language="javascript"> function doclick() { var td ...

  7. Qt在线技术交流之OpenGL、Quick以及所经历项目开发心得分享

    时间:3月25日晚上7:30 主题:Qt在线技术交流之OpenGL.Quick以及所经历项目开发心得分享 直播:http://qtdream.com 主页.全民TV,可能会加上其他的直播平台进行转播 ...

  8. HDU2084_数塔【简单题】【数塔】

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. Machine Learning—Online Learning

    印象笔记同步分享:Machine Learning-Online Learning

  10. 读写锁(pthread)

    读写锁: 用于对于某个给定资源的共享访问,而不是像互斥锁那样,将所有试图进入临界区的线程都阻塞住 相关内容: 线程互斥锁 分配规则:(写独占,读共享) 1.只要没有线程持有某个给定的读写锁用于写,那么 ...