1. 程式人生 > 其它 >吳凡的題庫——快快程式設計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. 這不是程式設計題
題目描述
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. 鵲橋相會
題目描述
牛郎是地上的農民,織女是天上的神仙,他們相愛卻不能在一起,被迫分離。傳說在農曆七月初七,喜鵲會在他們之間架起一座鵲橋,而他們每年也只能在鵲橋上相聚一次。因為喜鵲們體力有限,只能支撐橋面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;
}