7-8 sdut-C语言实验- 冒泡排序中数据交换的次数
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
输入格式:
输入数据的第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100
输出格式:
输出共 T 行。
每行一个整数,代表本行数据从小到大冒泡排序所进行的交换次数
输入样例:
在这里给出一组输入。例如:
3
5 1 2 3 4 5
4 5 3 7 1
2 2 1
输出样例:
在这里给出相应的输出。例如:
0
4
1
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[110];
int main(){
int n,m;
int sum;
cin>>n;
while(n--){
sum=0;
cin>>m;
for(int j=1;j<=m;j++){
cin>>a[j];
}
for(int i=1;i<m;i++){
for(int y=1;y<=m-i;y++){
if(a[y]>a[y+1]){
swap(a[y],a[y+1]);
sum=sum+1;
}
}
}
cout<<sum<<endl;
}
return 0;
}
7-9 sdut-C语言实验-矩阵输出(数组移位)
输入N个整数,输出由这些整数组成的n行矩阵。
输入格式:
第一行输入一个正整数N(N<=20),表示后面要输入的整数个数。
下面依次输入N个整数。
输出格式:
以输入的整数为基础,输出有规律的N行数据。
输入样例:
在这里给出一组输入。例如:
5
3 6 2 5 8
输出样例:
在这里给出相应的输出。例如:
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[23];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int t=1,x=n,y=n;
cout<<a[1];
for(int i=2;i<=n;i++){
cout<<" "<<a[i];
}
while(y>1){
cout<<endl;
for(int i=n-t+1;i<=n;i++){
cout<<a[i]<<" ";
}
for(int i=1;i<n-t;i++){
cout<<a[i]<<" ";
}
cout<<a[n-t];
t++;
y--;
}
return 0;
}
7-10 sdut- C语言实验-数组逆序(数组移位)
分数 13
作者 马新娟
单位 山东理工大学
有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。
输入格式:
输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。
输出格式:
按先后顺序输出n个整数。
输入样例:
5 1 2 3 4 5
2
输出样例:
4 5 1 2 3
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[111];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int t;
cin>>t;
cout<<a[n-t+1];
for(int i=n-t+2;i<=n;i++){
cout<<" "<<a[i];
}
for(int i=1;i<=n-t;i++){
cout<<" "<<a[i];
}
return 0;
}
7-11 简版田忌赛马
分数 10
作者 usx程序设计类课程组
单位 绍兴文理学院
这是一个简版田忌赛马问题,具体如下:
田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。
输出格式:
对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。
输入样例:
4
3
92 83 71
95 87 74
2
20 25
21 12
10
1 2 3 24 5 6 7 8 9 12
11 13 15 19 22 34 14 21 44 99
4
10 15 16 37
14 20 30 40
输出样例:
200
400
-1200
0
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[110];
int b[110];
int main(){
int n;
cin>>n;
while(n--){
int t;
cin>>t;
for(int i=1;i<=t;i++) cin>>a[i];
for(int i=1;i<=t;i++){
for(int j=1;j<=t-i;j++){
if(a[j]<a[j+1])
swap(a[j],a[j+1]);
}
}
for(int i=1;i<=t;i++) cin>>b[i];
for(int i=1;i<=t;i++){
for(int j=1;j<=t-i;j++){
if(b[j]<b[j+1])
swap(b[j],b[j+1]);
}
}
int sum=0;
int m=t;
for(int i=t;i>=1;i--){
for(int j=m;j>=1;j--){
if(a[i]>b[j]){
sum=sum+1;
m=j-1;
break;
}
}
}
cout<<sum*200-200*(t-sum)<<endl;
}
return 0;
}
7-12 选择法排序之第k趟
分数 15
作者 颜晖
单位 浙大城市学院
本题要求使用选择法排序,将给定的n个整数从小到大进行排序,输出第k趟(k从0开始)排序后的结果。
选择排序的算法步骤如下:
第0步:在未排序的n个数(a[0]〜 a[n−1])中找到最小数,将它与 a[0]交换;
第1步:在剩下未排序的n−1个数(a[1] 〜 a[n−1])中找到最小数,将它与 a[1] 交换;
......
第k步:在剩下未排序的n−k个数(a[k]〜a[n−1])中找到最小数,将它与 a[k] 交换;
......
第n−2步:在剩下未排序的2个数(a[n−2] 〜a[n−1])中找到最小数,将它与 a[n−2]交换。
输入格式:
输入第一行给出一个不超过10的正整数n和一个不超过n-1的正整数k。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出排序过程中第k步(k从0开始)的中间结果,即第k步后a[0]〜 a[n−1]的值,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4 1
5 1 7 2
输出样例:
1 2 7 5
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int a[10010];
int main(){
int n,k;cin>>n>>k;
k++;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=k;i++){
int min=i;
for(int j=i+1;j<=n;j++){
if(a[j]<a[min])
swap(a[j],a[min]);
}
if(i==k){
cout<<a[1];
for(int j=2;j<=n;j++){
cout<<" "<<a[j];
}
return 0;
}
}
return 0;
}
7-13 阅览室
分数 20
作者 陈越
单位 浙江大学
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
输入格式:
输入在第一行给出一个正整数N(≤10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:
书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)
每一天的纪录保证按时间递增的顺序给出。
输出格式:
对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。
输入样例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
输出样例:
2 196
0 0
1 60
实现代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int t[1010],flag[1010];
int main(){
int n;
cin>>n;
getchar();
int x,y,z;
char m;
while(n--){
double sum=0;
int cnt=0;
while(~scanf("%d %c %d:%d",&x,&m,&y,&z)){
if(x==0) break;
if(m=='S'){
flag[x]=1;
t[x]=y*60+z;
}
else if(m=='E'){
if(flag[x]==1) {
flag[x]=0;
cnt++;
sum=sum+60*y+z-t[x];
}
}
}
if(cnt==0) printf("0 0\n");
else printf("%d %.0lf\n",cnt,sum/cnt);
}
return 0;
}