吴凡编纂的编程习题集:1401-1700章快速攻略
最编程
2024-02-08 18:40:34
...
- 螺旋填表
题目描述
手写一个如下图所示螺旋方阵是一件很容易的事,但是计算机打印出来就不容易了,因为打印机的打印头只能前进不能后退.解决的方法 是认真观察这 个方阵,从中发现规律,不难发现,螺旋方阵是从里到外进行填数,每一层的初始位置都固定在左上角,每一层又可分为下、右、上、左四个部分。运 用数组下标变化规律来控制填数,保证数据按螺旋线顺序存入数组。最后打印这个数组。
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;
}
- 三角旗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;
}
- 杨辉三角形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;
}
- 智商排序
题目描述
智商这个词的英文时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;
}
- 高考排名
题目描述
你是校长,学校共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;
}
- 单词查找
题目描述
输入一行字符串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;
}
- 二进制转十进制
题目描述
将一个二进制数转换成十进制数。
输入输出格式
输入格式
输入一行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;
}
- 站岗放哨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;
}
- 并列排名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;
}
- 枚举子集
题目描述
有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;
}
- 枚举组合
题目描述
有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