欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

吴凡编纂的编程习题集:1401-1700章快速攻略

最编程 2024-02-08 18:40:34
...
  1. 螺旋填表
题目描述
手写一个如下图所示螺旋方阵是一件很容易的事,但是计算机打印出来就不容易了,因为打印机的打印头只能前进不能后退.解决的方法 是认真观察这 个方阵,从中发现规律,不难发现,螺旋方阵是从里到外进行填数,每一层的初始位置都固定在左上角,每一层又可分为下、右、上、左四个部分。运 用数组下标变化规律来控制填数,保证数据按螺旋线顺序存入数组。最后打印这个数组。
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
输入输出格式
输入格式
一个正整数n,n<=100
输出格式
n行n列个正整数,注意:行末不能出现空格
输入输出样例
输入样例#1:
5
输出样例#1:
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

#include<iostream>
using namespace std;
const int N=109;
int n,a[N][N],b[2]={0,1};
int main(){
	cin>>n;
	int k=n,t=1,p=1;
	for(int i=1;i<=n*n;i++){
		b[p/(k+1)]+=t;
		a[b[0]][b[1]]=i;
		p=p+1;
		if(p>2*k-1){
			p=1;
			k=k-1;
			t=-t;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n-1;j++)
		    cout<<a[i][j]<<" ";
		cout<<a[i][n];
		cout<<endl;
	}
	return 0;
}
  1. 三角旗2
题目描述
请写一个程序,输入是一个正整数n,输出一个边长为n的三角旗,高n行,宽n列,由#符合组成,形状参考样例:第一行有n-1个空格和1 个#,第二行有n-2个空格和2个#,以此类推。
请注意,每行行首和行末不能有多余空格。
输入输出格式
输入格式
输入文件triangle2.in 输入一个正整数n,不超过1000
输出格式
输出文件triangle2.out 输出n行字符串
输入输出样例
输入样例#1:
5
输出样例#1:
    #
   ##
  ###
 ####
#####
输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("triangle2.in", "r", stdin);
	freopen("triangle2.out", "w", stdout);
	int n;
	cin>>n;
	for(int i = 1; i <= n;i ++){
		for(int j = 1;j <=n-i; j ++){
			cout<<" ";
		}
		for(int j = 1; j <= i; j ++){
			cout<<"#";
		}
		cout<<endl;
	}
    return 0;
}
  1. 杨辉三角形2
题目描述
输入一个正整数n,打印出一个n行的杨辉三角形。n<=20。
请注意几点细节:
1.数据范围n<=20
2.输出每一行的行末数字后不可以出现空格。若行末出现空格会被判0分。
输入输出格式
输入格式
输入文件yh.in 输入一个正整数n。
输出格式
输出文件yh.out 输出共n行,第i行有i个数字由空格隔开。行末无空格。
输入输出样例
输入样例#1:
3
输出样例#1:
1
1 1
1 2 1
输入样例#2:
5
输出样例#2:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
输入样例#3:

输出样例#3:

#include<bits/stdc++.h>
using namespace std;
int tri[25][25], n;
int main(){
	freopen("yh.in", "r", stdin);
	freopen("yh.out", "w", stdout);
	cin>>n;
	tri[1][1] = 1;
	for(int i = 2; i <=n; i ++)
	    for(int j = 1; j <= i; j ++)
	        tri[i][j] = tri[i-1][j-1] + tri[i-1][j];
	for(int i = 1; i<=n; i ++){
	    for(int j = 1; j <=i-1; j ++)
	        cout<<tri[i][j]<<" ";
	    cout<<tri[i][i]<<endl;
	}
	return 0;
}
  1. 智商排序
题目描述
智商这个词的英文时intelligence quotient,简写为IQ。已知有n个学生,他们每个人的智商都是一个正整数,请将他们的智商从大到小排序
输入输出格式
输入格式
输入文件intelligence.in  输入第一行为正整数n,n<=200000。第二行为n个正整数,代表每个人的智商,由空格隔开,均不超过250。
输出格式
输出文件intelligence.out 输出一行共n个正整数,由空格隔开。
输入输出样例
输入样例#1:
3
90 120 100
输出样例#1:
120 100 90
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("intelligence.in", "r", stdin);
	freopen("intelligence.out", "w", stdout);
	int n,a[500001];
	cin>>n;
	for(int i=0;i<n;i++)		cin>>a[i];
	sort(a, a+n);
	reverse(a, a+n);
	for(int i=0;i<n;i++)	cout<<a[i]<<" ";
	return 0;
}
  1. 高考排名
题目描述
你是校长,学校共n名学生参加高考,学号从1到n编号。每个学生有一个总分,你需要将学生成绩从高到低排序。如果分数相同,学号小 的排在前面。
输入输出格式
输入格式
输入文件rank.in 输入第一行为正整数n,n<=100000。第二行共n个正整数,依次代表n个人的总分:第1个分数对应学号为1的学生,第2 个分数对应学 号为2的学生,以此类推,最后一个分数对应学号为n的学生。分数均不超过1000。
输出格式
输出文件rank.out 输出共n行,每行两个数字,由空格隔开,第一个数为学号,第二个数字为该学生的总分。注意行末不能有空格。
输入输出样例
输入样例#1:
4
59 60 60 100
输出样例#1:
4 100
2 60
3 60
1 59
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
const int N=100001;
struct student{
	int id, score;
};
bool cmp(const student&a, const student&b){
	if(a.score>b.score)	return true;
	if(a.score<b.score)	return false;
	if(a.id<b.id)	return true;
	return false;
}
int main(){
	freopen("rank.in", "r", stdin);
	freopen("rank.out", "w", stdout);
	int n, cnt=0;
	student s[N];
	cin>>n;
	for(int i=0;i<n;i++){
		cnt++;
		cin>>s[i].score;
		s[i].id = cnt;
	}
	sort(s, s+n, cmp);
	for(int i=0;i<n;i++){
		cout<<s[i].id<<" "<<s[i].score<<endl;
	}
	return 0;
}
  1. 单词查找
题目描述
输入一行字符串a,以换行结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。请问某个单词b,是否在字符串a中独立出现,请定位b的位置。
输入输出格式
输入格式
输入包括2行,第1行是包含多个英文单词的字符串 a;第2行是待查找的单词b(长度 <= 100),b是由若干个英文字母组成中间没有其他符 号。
输出格式
如果找到了就输出该单词b第一次出现时首字母在a的第几个位置。如果没有找到独立的单词b就输出sorry
输入输出样例
输入样例#1:
wa ha ha
ha
输出样例#1:
4
输入样例#2:
A pineapple is not an apple
apple
输出样例#2:
23
输入样例#3:
abcdefghijk
abc
输出样例#3:
sorry
#include<bits/stdc++.h>
using namespace std;
int main(){
	string s, word;
	int id;
	getline(cin, s);
	getline(cin, word);
	s = " " + s + " ";
	id = s.find(" " + word + " ");
	if(id != -1)	cout<<id + 1;
	else	cout<<"sorry";
	return 0;
}
  1. 二进制转十进制
题目描述
将一个二进制数转换成十进制数。
输入输出格式
输入格式
输入一行01串,长度不超过60。
输出格式
输出一个整数。
输入输出样例
输入样例#1:
111
输出样例#1:
7
输入样例#2:
1111
输出样例#2:
15
输入样例#3:

输出样例#3:

#include<iostream>
#include<string>
#include<cmath> 
using namespace std;
int main(){
	long long result=0;
	string s;
	cin>>s;
	for(int i=0; i<s.size(); i++){ 
		result *= 2;
		if(s[i]=='1')result++; 
	}
	cout<<result; 
	return 0; 
}
  1. 站岗放哨2
题目描述
一条直线上,你安排了n个哨兵站岗放哨,编号从1到n。其中i号哨兵的坐标位置是x[i]。不会有哨兵站在相同的位置。作为指挥官,你需要知道3个信息:
1.从左到右,每个哨兵的坐标依次是几?
2.从左到右,每个哨兵依次是几号哨兵?
3.哨兵编号从1到n,每个哨兵依次站在从左到右的第几个?
输入输出格式
输入格式
输入文件guard.in
输入第一行包含正整数n。1<=n<=100000。第二行共n个正整数,代表每个哨兵的坐标,均不超过1000000000。
输出格式
输出文件guard.out
输出共3行,每行n个正整数。
输入输出样例
输入样例#1:
5
7 8 10 6 9
输出样例#1:
6 7 8 9 10
4 1 2 5 3
2 3 5 1 4
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
struct guard{
	int x, id;
};
bool cmp(const guard&u,const guard&v){
	return u.x<v.x;
}
int main(){
	freopen("guard.in","r",stdin);
	freopen("guard.out","w",stdout);
	int n, rk[100000];
	guard g[100000];
	cin>>n;
	for(int i=1;i<=n;i++) cin>>g[i].x;
	for(int i=1;i<=n;i++) g[i].id=i;
	sort(g+1,g+1+n,cmp);
	for(int i=1;i<=n;i++) rk[g[i].id]=i;
	for(int i=1;i<=n;i++) cout<<g[i].x<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++) cout<<g[i].id<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++) cout<<rk[i]<<" ";
	cout<<endl;
	return 0;
} 
  1. 并列排名2
题目描述
你作为教务老师,手上有一份n名学生的成绩,你需要计算每个学生排第几名,注意会出现并列名次。
输入输出格式
输入格式
输入文件rank.in
输入第一行为正整数n,n<=100000。第二行是n个正整数分数,在0到1000000000之间。
输出格式
输出文件rank.out
输出共一行,有n个正整数依次代表每人的名次,由空格隔开。
输入输出样例
输入样例#1:
4
59 100 99 100
输出样例#1:
4 1 3 1
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int n;
int x[100008];
int id[100008];
int rk[100008];
bool cmp(const int&a,const int&b){
	return x[a]>x[b];
}
int main(){
	freopen("rank.in", "r", stdin);
	freopen("rank.out", "w", stdout);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>x[i];
	for(int i=1;i<=n;i++) id[i]=i;
	sort(id+1,id+1+n,cmp);
	for(int i=1;i<=n;i++) rk[id[i]]=i;
	
	for(int i=1;i<=n-1;i++)
		if(x[id[i]]==x[id[i+1]])
		    rk[id[i+1]]=rk[id[i]];
	for(int i=1;i<=n;i++) cout<<rk[i]<<" ";
	return 0;
}
  1. 枚举子集
题目描述
有n个数字组成的集合,{1,2,3,...,n}。请枚举所有非空子集。



输出的先后顺序遵循以下规则:

1.每行输出一个子集,每个子集的元素从小到大输出,由空格隔开,行末不能有空格。

2.较小数字开头的子集比较大数字开头的子集先输出。

3.开头数字一样的话,再依次比较后续数字。后续有数字的子集先输出,后续没有数字的子集后输出。

输入输出格式
输入格式
输入文件subsets.in
输入第一行包含正整数n。1<=n<=15。
输出格式
输出文件subsets.out
输出共n行,每行若干个正整数。
输入输出样例
输入样例#1:
3
输出样例#1:
1 2 3
1 2
1 3
1
2 3
2
3
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int n,ok[20],p[20];
void print(){
	int m=-1;
	for(int i=0;i<=n;i++)
	    if(ok[i])p[++m]=i;
	if(m==-1)return;
	for(int i=0;i<m;i++)
	    cout<<p[i]<<" ";
	cout<<p[m]<<endl;
}
void dfs(int x){
	if(x==n+1){
		print();
		return;
	}
	ok[x]=1;
	dfs(x+1);
	ok[x]=0;
	dfs(x+1);
}
int main(){
	freopen("subsets.in","r",stdin);
	freopen("subsets.out","w",stdout); 
	cin>>n;
	dfs(1);
	return 0;
}
  1. 枚举组合
题目描述
有n个数字组成的集合,{1,2,3,...,n}。给定一个m,1<=m<=n。对于从n个数里选m个数的组合情况,请枚举所有可能方案。



输出的先后顺序遵循以下规则:

1.每行输出一个组合,每个组合的元素从小到大输出,由空格隔开,行末不能有空格。

2.较小数字开头的组合大数字开头的组合先输出。

3.开头数字一样的话,再依次比较后续数字。

输入输出格式
输入格式
输入文件combinations.in
输入第一行包含正整数n和m。1<=m<=n<=15。
输出格式
输出文件combinations.out
输出共C(n,m)行,每行若干个正整数。
输入输出样例
输入样例#1:
3 2
输出样例#1:
1 2
1 3
2 3
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int n,m,p[20];
void print(){
	for(int i=1;i<m;i++)
	    cout<<p[i]<<" ";
	cout<<p[m]<<endl;
}
void dfs(int x,int c){
	if(c==m){
		print();
		return;
	}
	if(c+n+1-x<m)return;
	if(x==n+1)return;
	p[c+1]=x;
	dfs(x+1,c+1);
	dfs(x+1,c);
}
int main(){
	freopen("combinations.in","r",stdin);
	freopen("combinations.out","w",stdout); 
	cin>>n>>m;
	dfs(1,0);
	return 0;
}

原文地址:https://www.cnblogs.com/WindowsRegedit/p/16123767.html