noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05

T01 查找特定元素的值

描述

在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。

输入

第一行包含一个正整数n,表示序列中元素个数。1 <= n <= 10000。
第二行包含n个整数,依次给出序列的每个元素,相邻两个整数之间用单个空格隔开。元素的绝对值不超过10000。
第三行包含一个整数x,为需要查找的特定值。x的绝对值不超过10000。

输出

若序列中存在x,输出x第一次出现的下标;否则输出-1。

样例输入
5
2 3 6 7 3
3
样例输出
2

样例

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int a[10001],n,m;
 5 int main()
 6 {
 7     cin>>n;
 8     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 9     cin>>m;
10     for(int i=1;i<=n;i++)
11      if(a[i]==m)
12      {
13          cout<<i;return 0;
14      }
15     cout<<-1;
16 }

T02 输出最高分数的学生姓名

描述

输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。

输入

第一行输入一个正整数N(N <= 100),表示学生人数。接着输入N行,每行格式如下:
分数 姓名
分数是一个非负整数,且小于等于100;
姓名为一个连续的字符串,中间没有空格,长度不超过20。
数据保证最高分只有一位同学。

输出

获得最高分数同学的姓名。

样例输入
5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim
样例输出
hanmeimei

样例

不一样的解法:利用map有序存数的特点,慢2ms

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<map>
 4 #include<cstring>
 5 using namespace std;
 6 map<int ,string>mp;
 7 int n;
 8 int main()
 9 {
10     cin>>n;
11     for(int i=1;i<=n;i++)
12     {
13         int m;
14         string a;
15         cin>>m>>a;
16         mp[m]=a;
17     }
18     map<int,string>::iterator it=mp.end();
19     it--;
20     cout<<it->second;
21 }

一般解法:0ms

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int n,maxx;
 6 string ans;
 7 int m;
 8 string a;
 9 int main()
10 {
11     cin>>n;
12     for(int i=1;i<=n;i++)
13     {
14         cin>>m>>a;
15         if(m>maxx)
16         {
17             ans=a;
18             maxx=m;
19         }
20     }
21     cout<<ans;
22 }

2

T03 不高兴的津津

描述

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入

包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出

包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

样例输入
5 3
6 2
7 2
5 3
5 4
0 4
0 6
样例输出
3

样例

 1 #include<iostream>
 2 using namespace std;
 3 int maxx,ans;
 4 int main()
 5 {
 6     int a,b;
 7     for(int i=1;i<=7;i++)
 8      {
 9          cin>>a>>b;
10          if(a+b>maxx)
11          {
12              maxx=a+b;
13              ans=i;
14          }
15      }
16      cout<<ans;
17 }

T04 谁拿了最多奖学金

描述

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

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元。

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

输入

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

输出

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

样例输入
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
样例输出
ChenRuiyi
9000
28700

样例

 1 #include<iostream>
 2 using namespace std;
 3 int maxx,sum;
 4 string name,a;
 5 int n,qimo,banji,lunwen;
 6 char ganbu,xibu;
 7 int main()
 8 {
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11      {
12          cin>>a>>qimo>>banji>>ganbu>>xibu>>lunwen;
13          int k=0;
14          if(qimo>80&&lunwen) k+=8000;
15          if(qimo>85&&banji>80) k+=4000;
16          if(qimo>90) k+=2000;
17          if(qimo>85&&xibu==‘Y‘) k+=1000;
18          if(banji>80&&ganbu==‘Y‘) k+=850;
19          if(k>maxx)
20          {
21              maxx=k;
22              name=a;
23         }
24         sum+=k;
25      }
26      cout<<name<<endl<<maxx<<endl<<sum;
27 }

T05 最大值和最小值的差

描述

输出一个整数序列中最大的数和最小的数的差。

输入

第一行为M,表示整数个数,整数个数不会大于10000;
第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。

输出

输出M个数中最大值和最小值的差。

样例输入
5
2 5 7 4 2
样例输出
5

样例

方法1:读入的时候顺便记录最大最小值,时间6ms,内存464KB

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 int n,x;
 6 int maxx=-100001,minn=100001;
 7 int main()
 8 {
 9     cin>>n;
10     for(int i=1;i<=n;i++)
11     {
12         scanf("%d",&x);
13         maxx=max(maxx,x);
14         minn=min(minn,x);
15     }
16     cout<<maxx-minn;
17 }

1

方法2:读完之后,sort排序,时间12ms,内存464KB

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 int n,a[10001];
 6 int main()
 7 {
 8     cin>>n;
 9     for(int i=1;i<=n;i++)
10         scanf("%d",&a[i]);
11     sort(a+1,a+n+1);
12     cout<<a[n]-a[1];
13 }

2

时间: 2024-11-15 00:12:43

noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05的相关文章

noi题库(noi.openjudge.cn) 1.11编程基础之二分查找T01、02、04

T01 查找最接近的元素 描述 在一个非降序列中,查找与给定值最接近的元素. 输入 第一行包含一个整数n,为非降序列长度.1 <= n <= 100000.第二行包含n个整数,为非降序列各元素.所有元素的大小均在0-1,000,000,000之间.第三行包含一个整数m,为要询问的给定值个数.1 <= m <= 10000.接下来m行,每行一个整数,为要询问最接近元素的给定值.所有给定值的大小均在0-1,000,000,000之间. 输出 m行,每行一个整数,为最接近相应给定值的元素

noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T06——T15

T06 笨小猴 描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入 只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100. 输出 共两行,第一行是一个字符串,假

[NOI题库]1.1题解

今年NOIP居然"各有两道题目从NOI题库中抽取并在原题基础上改动后使用",不好好刷题怎么行. 这是第一篇题解文章,因为题目太水直接上代码了. 1.1编程基础之输入输出 01 Hello, World! 根据题意直接输出"Hello, World!"即可. #include <iostream> using namespace std; int main() { cout<<"Hello, World!"<<e

NOI题库 1768最大子矩阵 题解

NOI题库 1768最大子矩阵  题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 9 2 -4 1 -1 8 这个子矩阵的大小是15. 输入   输入是一个N * N的矩阵.输入的第一行给出N (0 < N <= 100).再后面的若干行中,依

【NOI题库】9269:Big String超级字符串

传送门:http://noi.openjudge.cn/ch0207/9269/ //------------------------------------题目内容-------------------------------------- 9269:Big String超级字符串 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 描述 fish在无数次oi竞赛的狱炼之后,悟出一个真理,往往越容易的题目,陷阱越深.由此,fish创作了这道题目. f

[NOI题库]1.3编程基础之算术表达式与顺序执行 题解(一)

01 A+B问题 经典的A+B Problem——各大题库上的首题.读入$a,b$,输出$a+b$. #include <iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a+b<<endl; return 0; } 01.cpp 02 计算(a+b)*c的值 读入$a,b,c$,输出$c(a+b)$. #include <iostream> u

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20

T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= m <= 100.接下来n行,每行m个整数,表示图像的每个像素点灰度.相邻两个整数之间用单个空格隔开,每个元素均在0~255之间. 输出 m行,每行n个整数,为顺时针旋转90度后的图像.相邻两个整数之间用单个空格隔开. 样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 7 4 1 8 5

noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入 输入包括3行,第1行是包含多个单词的字符串 s;第2行是待替换的单词a(长度 <= 100);第3行是a将被替换的单词b(长度 <= 100). s, a, b 最前面和最后面都没有空格. 输出 输出只有 1 行,将s中所有单词a替换成b之后的字符串. 样例输入 You w

noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T37——T38

T37 雇佣兵 描述 雇佣兵的体力最大值为M,初始体力值为0.战斗力为N.拥有X个能量元素. 当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0.在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力. 一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期.每个能量元素恢复的体力值不超过当前的战斗力.每个能量元素只能使用一次. 请问:雇佣兵的战斗力最大可以到达多少. 输入 一行包括三个整数M.N