一、编程题
1、数组指定部分逆序重放
将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。
时间限制:1000
内存限制:65536
输入
输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n < 100)以及指定的k(1 <= k <= n)。 第二行是n个整数,每两个整数之间用空格分隔。
输出
输出为一行:输出按题目要求逆序后数组的整数,每两个整数之间用空格分隔。
样例输入
5 3
8 6 5 4 1
样例输出
5 6 8 4 1
参考答案:
include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
int n,k;
cin>>n>>k;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
for (int i=k;i>=1;i–)
{
cout<<a[i]<<" ";
}
for (int i=k+1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
2、序列排序
对于给定的正整数序列,按照每个数的各位数和从大到小排序,各位数和相同的按照本身大小排序,大的在前,小的在后。
时间限制:1000
内存限制:65536
输入
第一行1个整数n,表示序列的大小。( 0 < n ≤ 1000) 第二行n个正整数,表示序列的每个数,每个数不大于100000000。
输出
输出按照题目要求排序后的序列
样例输入
6
17 26 9 13 88 10
样例输出
88 9 26 17 13 10
参考答案:
include<bits/stdc++.h>
using namespace std;
struct num{
int a;
int g;
}s[100];
bool cmp(num a,num b){
if(a.g<b.g)
return a.g;
if(a.g>b.g)
return b.g;
if(a.a>b.a)
return b.a;
return a.a;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i].a;
s[i].g=s[i].a%10;
}
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i++){
cout<<s[i].a<<" ";
}
return 0;
3、内部元素之和
输入一个整数矩阵,计算位于矩阵内部的元素之和。所谓矩阵内部的元素,不在第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:1000
内存限制:65536
输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数(每个数大于等于0,小于1000),整数之间以一个空格分开。
输出
输出对应矩阵的内部元素和
样例输入
3 3
3 4 1
3 7 1
2 0 1
样例输出
7
参考答案:
include<iostream>
using namespace std;
int main(){
int m,n,sum=0;
cin>>m>>n;
int a[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i!=0&&i!=m-1&&j!=0&&j!=n-1)
sum+=a[i][j];
}
}
cout<<sum;
return 0;
}
4、谁考了第k名
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。
时间限制:1000
内存限制:65536
输入
第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的k(1≤k≤n)。 其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。
输出
输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)
样例输入
5 3
90788001 67.8
90788002 90.3
90788003 61
90788004 68.4
90788005 73.9
样例输出
90788004 68.4
参考答案:
include <iostream>
using namespace std;
int id[110];
double s[110];
int main(){
int n,k,it;
double t;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>id[i]>>s[i];
for(int i=0;i<n;i++){
int k=i;
for(int j=i;j<n;j++) if(s[j]<s[k]) k=j;
if(k!=i){
t=s[i];
s[i]=s[k];
s[k]=t;
it=id[i];
id[i]=id[k];
id[k]=it;
}
}
cout<<id[n-k]<<" "<<s[n-k];
return 0;
}
5、话题焦点人物
微博提供了一种便捷的交流平台。一条微博中,可以提及其它用户。例如Lee发出一条微博为:“期末考试顺利 @Kim @Neo”,则Lee提及了Kim和Neo两位用户。
我们收集了N(1 < N < 10000)条微博,并已将其中的用户名提取出来,用小于等于100的正整数表示。
通过分析这些数据,我们希望发现大家的话题焦点人物,即被提及最多的人(题目保证这样的人有且只有一个),并找出那些提及它的人。
时间限制:1000
内存限制:65536
输入
输入共两部分: 第一部分是微博数量N,1 < N < 10000。 第二部分是N条微博,每条微博占一行,表示为: 发送者序号a,提及人数k(0 < = k < = 20),然后是k个被提及者序号b1,b2…bk; 其中a和b1,b2…bk均为大于0小于等于100的整数。相邻两个整数之间用单个空格分隔。
输出
输出分两行: 第一行是被提及最多的人的序号; 第二行是提及它的人的序号,从小到大输出,相邻两个数之间用单个空格分隔。同一个序号只输出一次。
样例输入
5
1 2 3 4
1 0
90 3 1 2 4
4 2 3 2
2 1 3
样例输出
3
1 2 4
参考答案:
include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int m;
cin >> n;
int sender;
int mentioned;
int a[101][101] = { 0 };
for (int i = 0; i < n; i++) {
cin >> sender;//sender表示接下来要发微博的人
cin >> m;//m表示接下来要Q的人数
for (int j = 0; j < m; j++) {
cin >> mentioned;
a[sender][mentioned]++;
}
}
int max = 1;
//max表示被Q到最多的人的下标
for (int i = 1; i <= 100; i++) {
for (int j = 1; j <= 100; j++) {
a[0][i] += a[j][i];
}
if (a[0][i] > a[0][max])
max = i;
}
cout << max << endl;
bool isfirst=true;
for (int i = 1; i <= 100; i++) {
if ((a[i][max]) && (isfirst)) {
cout << i;
isfirst = false;
}
else if ((a[i][max]) && (!isfirst))
cout << " " << i;
}
return 0;
}
喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!




