编程语言
首页 > 编程语言> > 吴凡的题库——快快编程501-700

吴凡的题库——快快编程501-700

作者:互联网

  1. 排座椅
题目描述
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。

同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵 向的通道。

于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入输出格式
输入格式
输入文件chair.in 第一行,有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。
接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出格式
输出文件chair.out 共两行。
第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。
输入输出样例
输入样例#1:
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
输出样例#1:
2
2 4
输入样例#2:
无
输出样例#2:
无
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
#define N 1003
using namespace std; 
int m,n,k,l,d,x[N],y[N],c[N],o[N],res[N],len=1;
int main(){
    scanf("%d%d%d%d%d",&m,&n,&k,&l,&d); 
    for(int i=1;i<=d;i++){ 
        int xi,yi,pi,qi; 
        scanf("%d%d%d%d",&xi,&yi,&pi,&qi); 
        if(xi==pi)x[min(yi,qi)]++;
        else y[min(xi,pi)]++;
    } 
    for(int i=1;i<=k;i++){
        int maxn=-1,p;
        for(int j=1;j<m;j++)
            if(y[j]>maxn){maxn=y[j];p=j;} 
        y[p]=0;c[p]++;
    } 
    for(int i=1;i<=l;i++){ 
        int maxn=-1,p;
        for(int j=1;j<n;j++)
            if(x[j]>maxn){maxn=x[j];p=j;} 
        x[p]=0;o[p]++; 
    } 
    for(int i=0;i<N;i++)if(c[i]&&i!=0)res[++len]=i;
    for(int i=1;i<len;i++)if(res[i]!=0)printf("%d ",res[i]);
    printf("%d\n",res[len]);
	for(int i=1;i<=len;i++)res[i]=0;len=1; 
    for(int i=0;i<N;i++)if(o[i]&&i!=0)res[++len]=i;
    for(int i=1;i<len;i++)if(res[i]!=0)printf("%d ",res[i]);
    printf("%d\n",res[len]);
    return 0; 
}
  1. Hanoi双塔问题(同182)

  2. 排列生成

题目描述
输入n,1<=n<=8。输出n的全排列,每一行一个排列方案,数字由空格隔开,按照字典序输出。注意行末不能有空格。
输入输出格式
输入格式
如题
输出格式
如题
输入输出样例
输入样例#1:
2
输出样例#1:
1 2
2 1
输入样例#2:
3
输出样例#2:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int n,x[9];
void print(){
	for(int i=0;i<n-1;i++)cout<<x[i]<<" ";
	cout<<x[n-1]<<endl;
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++)x[i]=i+1;
	do{
		print();
	}while(next_permutation(x,x+n));
	return 0;
}
  1. 起个英文名1
题目描述
王村长生了个大胖儿子需要起英文名字,关键要朗朗上口。他认为有n种音节是好听的,必须都用到一次,那么有哪些排序方式呢?
输入输出格式
输入格式
输入文件名name1.in
输入第一行为正整数n,第二行有n个小写字符串各自代表一种音节(无重复),n<=5。
输出格式
输出文件名name1.out
输出儿子的小写英文名候选方案,每一行输出一个,按照字典序输出。注意儿子一定姓王。注意行末没有空格。
输入输出样例
输入样例#1:
2
tuo ni
输出样例#1:
nituo wang
tuoni wang
输入样例#2:
3
cha li si
输出样例#2:
chalisi wang
chasili wang
lichasi wang
lisicha wang
sichali wang
silicha wang
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
int n;
string s[6];
void print(){
	for(int i=0;i<n;i++)cout<<s[i];
	cout<<" wang"<<endl;
}
int main(){
	freopen("name1.in", "r", stdin);
	freopen("name1.out", "w", stdout);
	cin>>n;
	for(int i=0;i<n;i++)cin>>s[i];
	sort(s, s+n);
	do{
		print();
	}while(next_permutation(s,s+n));
	return 0;
}
  1. 罗密欧与朱丽叶
题目描述
在一个n*m格子的迷宫里,o代表空地可以行走,#代表墙体不可以通过,R代表罗密欧,J代表朱丽叶。罗密欧和朱丽叶每秒钟可以上下左右四个方 向走动一格,请问他们相遇需要至少几秒钟?如果无法相遇输出forever 。



输入输出格式
输入格式
输入文件romeo.in 输入第一行为n和m,n,m<=10。接着是n*m格的字符。
输出格式
输出文件romeo.out 输出forever或者一个浮点数,保留一位小数
输入输出样例
输入样例#1:
2 2
oJ
R#
输出样例#1:
1.0
输入样例#2:
4 5
ooo#J
o#o#o
o#o#o
R#ooo
输出样例#2:
6.5
输入样例#3:
2 2
R#
#J
输出样例#3:
forever
#include<bits/stdc++.h>
#define N 19
using namespace std;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int m,n,xR,yR,xJ,yJ,dst[N][N];
char d[N][N];
bool vst[N][N];
struct Node{
	int x,y;
};
int bfs(){
	queue<Node> q;
	vst[xR][yR]=1;
	dst[xR][yR]=0;
	q.push((Node){xR,yR});
	while(!q.empty()){
		Node now=q.front();
		q.pop();
		for(int k=0;k<4;k++){
			int nx=now.x+dx[k],ny=now.y+dy[k];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&d[nx][ny]!='#'&&!vst[nx][ny]){
				vst[nx][ny]=1;
				dst[nx][ny]=dst[now.x][now.y]+1;
				q.push((Node){nx,ny});
				if(nx==xJ&&ny==yJ)return dst[nx][ny];
			}
		}
	}
	return -1;
}
int main(){
	freopen("romeo.in", "r", stdin);
	freopen("romeo.out", "w", stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=m;j++){
	        cin>>d[i][j];
	        if(d[i][j]=='R')xR=i,yR=j;
	        if(d[i][j]=='J')xJ=i,yJ=j;
		}
	int res=bfs();
	if(res==-1)cout<<"forever";
	else cout<<fixed<<setprecision(1)<<res/2.0;
	return 0;
}
  1. 这不是编程题
题目描述
1.以下哪个是灰太狼的老婆  A.红太狼  B.红太阳  C.红彤彤  D.红金宝
2.以下哪个是中国古代四大美女之一  A.杨玉环  B.杨紫  C.杨颖  D.杨幂
3.在四大天王里任选两个(不计顺序),共有几种选法? 注意:这不是编程题,只是披着编程题外衣的选择/填空题。你只需要提交如下代码,并在(*)行处填入你的答案即可
#include<iostream>
#include<string>
using namespace std;
string ans[3]={"A","C","1"};    // (*)
int i;
int main() {
cin>>i;
cout<<ans[i-1]<<endl;
return 0;
}
输入输出格式
输入格式
无
输出格式
无
输入输出样例
输入样例#1:
无
输出样例#1:
无
输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

#include<iostream> 
#include<string>
using namespace std; 
string ans[3]={"A","A","6"};
int i;
int main() {    
	cin>>i;
	cout<<ans[i-1]<<endl;
	return 0;
}
  1. 中位数
题目描述
中位数也就是中间位置的数。
有一个数组共n个元素(n为奇数),其中某个数x称为中位数,x满足如下条件: 可以将数组内除了x以外的其他n-1个数分为个数相等的 两组数字A,B。A中的数值都不大于x,B中的值都不小于x。
输入输出格式
输入格式
输入文件median.in  输入第1行是一个正奇数n。第2行n个正整数。
数据规模:
对于30%的数据,1<=n<=100
对于70%的数据,1<=n<=10000
对于100%的数据,1<=n<=100000,数组元素均不超过1000
输出格式
输出文件median.out 输出一个整数,表示中位数的值。
输入输出样例
输入样例#1:
5
1 2 3 4 5
输出样例#1:
3
输入样例#2:
5
1 2 2 4 5
输出样例#2:
2
输入样例#3:

输出样例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("median.in", "r", stdin);
	freopen("median.out", "w", stdout);
	int n,a[100001];
	cin>>n;
	for(int i = 0; i < n; i ++)		cin>>a[i];
	sort(a, a+n);
	cout<<a[(n+1)/2-1];
	return 0;
}
  1. 面条切割
题目描述
有n根面条。每根面条可以切割开成为若干正整数长度小面条,但不能拼 接。现在要从这些面条中切割出m条长度相同的小面条,求每段小面条的 最大长度是多少。允许有剩余
输入输出格式
输入格式
输入:第一行是正整数n和m,n<=10^5,m<=10^8。第二行是n 个不超过10^6 的正整数,表示每条的长度。
输出格式
输出:切出小面条的最大长度,若无法切割,输出Failed。
输入输出样例
输入样例#1:
3 4
10 5 9
输出样例#1:
5
输入样例#2:
4 5
5 6 7 8
输出样例#2:
4
输入样例#3:
无
输出样例#3:
无
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,x[1000008];
bool OK(ll len){
	ll cnt=0;
	for(ll i=0;i<n;i++){
		cnt+=x[i]/len;
		if(cnt>=m)return 1;
	}
	return 0;
}
int main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>x[i];
	ll l=1;
	ll r=*max_element(x,x+n);
	ll ans=0;
	while(l<=r){
		ll mid=l+(r-l)/2;
		if(OK(mid))ans=mid,l=mid+1;
		else r=mid-1;
	}
	if(ans>0)cout<<ans;
	else cout<<"Failed";
	return 0;
}
  1. 鹊桥相会
题目描述
牛郎是地上的农民,织女是天上的神仙,他们相爱却不能在一起,被迫分离。传说在农历七月初七,喜鹊会在他们之间架起一座鹊桥,而他们每年也只能在鹊桥上相聚一次。因为喜鹊们体力有限,只能支撑桥面100秒,100秒后鹊桥就会坍塌。鹊桥长度为L米,牛郎的奔跑速 度为每秒u米,织女的速度为每秒v米。牛郎和织女同时从桥两头开始奔跑,最终要在桥坍塌前安全回到各自起点,那么他们最多能拥抱在一起几秒?
输入输出格式
输入格式
输入文件bridge.in  输入第一行为正整数L,u,v,均不超过1000。
输出格式
输出文件bridge.out 输出一个浮点数,保留2位小数。
输入输出样例
输入样例#1:
1000 400 100
输出样例#1:
96.00
输入样例#2:
50 4 4
输出样例#2:
87.50
输入样例#3:

输出样例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
 freopen("bridge.in", "r", stdin);
 freopen("bridge.out", "w", stdout);
 double L, u, v;
 double result;
 cin>>L>>u>>v;
 result = max(100 - L / (u + v) * 2, 0.0);
 cout<<fixed<<setprecision(2)<<result<<endl;
 return 0;
}
  1. 体育乐园
题目描述
因为数学老师总是以各种理由霸占体育课的时间来上数学课,体育老师心中积怨已久。有一天体育老师把数学老师关在“体育乐园”里,这里对体育老师来说是个乐园,有篮球足球乒乓球,但对于身体柔弱的数学老师来说简直就是监牢。乐园大门的锁需要密码才能打开,真正密码藏在一串字符串S里。作为数学课代表,你要解救数学老师。有一个道理大家都明白,体育老师因为忌恨数学所以不会用数字作为密 码,S里去除所有数字后就是真正的密码。给定S,请你求出真正的秘密。
输入输出格式
输入格式
输入文件paradise.in  输入一行包含一串字符串,长度不超过1000。

输出格式
输出文件paradise.out  输出一串字符串,代表真正密码
输入输出样例
输入样例#1:
123soc456cer7890
输出样例#1:
soccer
输入样例#2:
si33zhi44fa55da
输出样例#2:
sizhifada
输入样例#3:

输出样例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("paradise.in", "r", stdin);
	freopen("paradise.out", "w", stdout);
	string s;
	getline(cin, s);
	for(int i = 0; i < s.size(); i++){
		if(!(s[i] <= '9' && s[i] >= '0'))
		    cout<<s[i];
	}
	return 0;
}
  1. 均分纸牌
题目描述
有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张。可以在任一堆上取若干张纸牌,然后移动。

移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。输出最少的移动次数,若无解输出-1。
输入输出格式
输入格式
输入文件名cards.in
输入第一行为正整数N(N 堆纸牌,1 <= N <= 100),第二行为N个正整数A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)
输出格式
输出文件名cards.out
输出一个整数。
输入输出样例
输入样例#1:
4
9 8 17 6
输出样例#1:
3
输入样例#2:
3
6 6 6
输出样例#2:
0
输入样例#3:
无
输出样例#3:
无
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,card[105],ave,step;
int main()
{
    freopen("cards.in", "r", stdin);
    freopen("cards.out", "w", stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d",&card[i]),ave+=card[i];
    ave=ave/n;
    for(int i=1;i<=n;++i)
    {
        if(ave==card[i]) continue;
        card[i+1]+=card[i]-ave,step++;
    }
    printf("%d\n",step);
    return 0;
}

标签:输出,int,700,输入输出,样例,格式,题库,输入,吴凡
来源: https://www.cnblogs.com/WindowsRegedit/p/16125105.html