第一题:最高分姓名 (name)
[问题描述]
学校给学信息学的同学举办一次小测试,现给出参与测试的同学姓名和分数,老师想表扬最高分的同学,请你把最高分的学生姓名输出来(最高分唯一)
[输入格式]
输入有n+1行, 第1行为1个正整数,表示数的个数:N (1到100之间的整数) 后N行有N个姓名(字符串)和分数(0到500之间的整数),用空格隔开
[输出格式]
最高分姓名
[样例输入]
2
wangdada 100
lixiaoxiao 99
[例输出]
wangdada
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
string name;
int score;
};
int comp(student a,student b){
return a.score>b.score;
}
int main(){
student stu[101];
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].name>>stu[i].score;
}
sort(stu,stu+n,comp);
cout<<stu[0].name;
return 0;
}
第二题:颠倒的数字(numbers)
[问题描述] 一些数字可以颠倒过来看,例如0、1、8颠倒过来还是本身,6颠倒过来是9,9颠倒过来看还是6.其他数字颠倒过来都不构成数字。类似的,一些多位数也可以颠倒过来看,比如106颠倒过来是901,颠倒的数字就是原数字。假设这个数字只由n位数字组成(n为整数,3<=n<=210),每一位都可以取0到9。请判断m个数字是不是颠倒后还是不是原数,还是原数就输出1,不是原数输出0
[输入格式]
m+1行,第一行一个整数m,m为int类型范围 后面m行整数,每一个整数占一行
[输出格式]
输出m行,每行不是1就是0
[样例输入]
2
1234
88888
[样例输出]
0
1
#include<iostream>
using namespace std;
int main(){
int m;
cin>>m;
long long a[m];
for(int i=0;i<m;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
int flag=1;
long long k=a[i];
while(k){
k=k%10;
if(k==0||k==1||k==6||k==8||k==9){
}else{
flag=0;
break;
}
k=k/10;
}
if(flag==0){
cout<<0<<endl;
}else{
cout<<1<<endl;
}
}
return 0;
}
第三题:找单词游戏 (words)
[问题描述] 如何快速找到一行句子里最长和最短的单词,输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字符构成,单词间的间隔可能是多个空格、句号和逗号,试输出第1个最长的单词和第1个最短单词。
[输入格式]
一行句子。
[输出格式]
第1行,第一个最长的单词.
第2行,第一个最短的单词。
[样例输入]
I love Hefei,I love learning Programming.
[输出]
Programming
I
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[20000];
cin.getline(a,200000);
//gets(a); //输入数组
int n=strlen(a); //计算长度
int t=0;
int max1,min1,max2,min2,maxn=0,minn=100; //1和2分别为起始位置和结束位置,
//带n的计算长度
a[n]=' '; //在最后一个单词后加空格,否则单词无法计算
for(int i=0; i<=n; i++) //枚举
{
if(a[i]!=' ' && a[i]!=','&&a[i]!='.') //如果是单词
t++; //计数器加一
else if(t>0) //否则
{
if(t>maxn) //如果大于最大
{
maxn=t; //计算长度
max1=i-t; //起始位置
max2=i-1; //结束位置
}
if(t<minn) //如果小于最小
{
minn=t; //同上
min1=i-t;
min2=i-1;
}
t=0; //计数器归0
}
}
for(int i=max1; i<=max2; i++) //输出最大和最小
cout<<a[i];
cout<<endl;
for(int i=min1; i<=min2; i++)
cout<<a[i];
return 0; //养成好习惯
}
第四题:排队预登记 (line)
[问题描述] 排队是件头疼的事,在社区中登记信息有的时候需要排一个很长的队,但是其实每个人的优先级都不一样,比如我们可以采用预登记的方式,提前摸排人员情况,让年纪大的先排队,体现人文关怀。现在将预登记的人员按照以下原则排出的先后顺序:
1.老年人(年龄>= 60岁)比非老年人优先排队。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序排队。
4.残疾人不论年纪大小,一律上门做登记,不参与排队。
[输入格式]
第1行,输入一个小于100的正整数,表示个数; 后面按照登记的先后顺序,每行输入一个人的信息,包括:一个长度小于10的字符串表示人的ID(每个人的ID各不相同且只含数字和字母),一个整数表示人的年龄,另一个整数表示是否是残疾人,是为1,否为0,中间用单个空格隔开。
[输出格式]
按排好的顺序输出人的ID,每行一个
[样例输入]
6
21075 40 0
14003 15 0
10158 67 0
14658 57 1
21033 75 0
12012 30 0
[样例输出]
21033
10158
21075
14003
12012
#include<iostream>
#include<algorithm>
using namespace std;
struct people{
string id;
int age;
int iscanji;
};
int comp(people a,people b){
return a.age>b.age;
}
int main(){
people p[101];
people p1[101];//老年人
people p2[101];//非老年人
int n,j=0,k=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].id>>p[i].age>>p[i].iscanji;
if(p[i].iscanji==0&&p[i].age>=60){
p1[j++]=p[i];
}else if(p[i].iscanji==0&&p[i].age<60){
p2[k++]=p[i];
}
}
sort(p1,p1+j,comp);
for(int i=0;i<j;i++){
cout<<p1[i].id<<endl;
}
for(int i=0;i<k;i++){
cout<<p2[i].id<<endl;
}
return 0;
}
第五题:运输木材 (tree)
[问题描述]
牛牛家有一个林场,现有 条木材,每条木材的长度已知且均为正整数。木材可以以任意正整数长度切割,但不可以连接。假设木材直径都一致,现有卡车可装m条木材,但是卡车长度有限,现在要从这些木材中切割出 m 条长度相同的木材,为经济效益最大化,应该选择多长的卡车,求这些木材的最大长度是多少。
[输入格式]
第一行是一个不超过 100的正整数 n。
第二行是 n个不超过10的6次方的正整数,表示每条材的长度。
第三行是一个不超过10的8次方的正整数 m。
[输出格式]
绳段的最大长度,若无法切割,输出“Failed”
[样例输入]
3
30 20 55
4
[样例输出]
20
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
int n,m,l=0,r=100000001;
cin>>n;
for (int i=1; i<=n; ++i)
cin>>a[i];
cin>>m;
while(r-l>1)
{
int mid=(l+r)/2;
int sum = 0;
for (int i=1; i<=n; ++i)
sum += a[i]/mid;
if(sum>=m) l=mid;
else r=mid;
}
cout<<l;
return 0;
}