1. 程式人生 > 其它 >吳凡的題庫——快快程式設計151-200

吳凡的題庫——快快程式設計151-200

  1. Hanoi雙塔
題目描述
給定A、B、C三根足夠長的細柱,在A柱上放有2n箇中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓 盤是不加區分的(下圖為n=3的情形)。現要將這些圓盤移到C柱上,在移動過程中可放在B柱上暫存。要求:
(1)每次只能移動一個圓盤;
(2)A、B、C三根細柱上的圓盤都要保持上小下大的順序;
任務:設An為2n個圓盤完成上述任務所需的最少移動次數,對於輸入的n,輸出An。

hanoi雙塔.bmp

輸入輸出格式
輸入格式
輸入檔案 hanoi.in 一個正整數n,表示在A柱上放有2n個圓盤。
對於50%的資料,1<=n<=25
對於100%的資料,1<=n<=200
輸出格式
輸出檔案 hanoi.out 一個正整數, 為完成上述任務所需的最少移動次數
輸入輸出樣例
輸入樣例#1:
2
輸出樣例#1:
6
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("hanoi.in","r",stdin);
	freopen("hanoi.out","w",stdout);
    int n;
    cin>>n;
    stringstream s;
    s.precision(0);
    s<<fixed<<pow(2.0L,n+1);
    string a=s.str();
    a[a.length()-1]--;
    a[a.length()-1]--;
    cout<<a<<endl;
    return 0;
}
  1. 逃難
題目描述
殭屍大戰爆發後,爺爺需要帶上值錢的財寶去逃難 ,他的每個寶物都有各自的價錢和重量。爺爺請你 幫他對所有寶物進行排序。越值錢的排在越靠前, 如果價錢一樣重量越小越靠前。如果價錢和重量都 一樣,那麼編號越小越靠前。
輸入輸出格式
輸入格式
輸入檔案escape.in 輸入第一行為n,之後n行每行 有三個整數,代表每件寶物的編號,價格和重量, 編號依次為1到n。n<=10000
輸出格式
輸出檔案escape.out 輸出共n行,為排序後的編號 。

輸入輸出樣例
輸入樣例#1:
4
1 10000 5
2 888 2
3 666666 10
4 888 1
輸出樣例#1:
3
1
4
2
輸入樣例#2:

輸出樣例#2:

輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
const int N=100001;
struct escape{
	int id, value, weight;
};
bool cmp(const escape&a, const escape&b){
	if(a.value>b.value)	return true;
	if(a.value<b.value)	return false;
	if(a.weight<b.weight)	return true;
	if(a.weight>b.weight)	return false;
	if(a.id<b.id)	return true;
	if(a.id>b.id)	return false;
}
int main(){
	freopen("escape.in", "r", stdin);
	freopen("escape.out", "w", stdout);
	int n;
	escape s[N];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>s[i].id;
		cin>>s[i].value;
		cin>>s[i].weight;
	}
	sort(s, s+n, cmp);
	for(int i=0;i<n;i++){
		cout<<s[i].id<<endl;
	}
	return 0;
}
  1. 英雄榜
題目描述
人們在評選世界上的超級英雄們哪個更厲害,通過 投票對英雄的攻擊力,防禦力,人品這三個方面進 行了打分。現在請你將投票結果進行排序:三項總 分越高排名越靠前;總分相同時,人品越高排名越 靠前;若總分和人品都相同,攻擊力越高排名越高 ;若總分,人品,攻擊力和防禦力都相同,按照英 雄名稱的字典序排列。
輸入輸出格式
輸入格式
輸入第一行為n,代表有n個英雄,1<=n<=100,每項得分都是整數,範圍是[0,100]。保證英雄名稱都是連續的大寫字母。以下每行為英雄名稱,攻擊力, 防禦力,人品。
輸出格式
輸出排序結果,每行一位英雄
輸入輸出樣例
輸入樣例#1:
10
MONKEYKING 90 90 80
CAPTAINAMERICA 60 60 70
MAGNETO 85 30 10
ULTRAMAN 80 90 80
HIPPOPMAN 0 0 80
WOLVERINE 70 80 20
DORAEMON 50 20 100
IRONMAN 80 60 30
BATMAN 80 60 50
SUPERMAN 80 70 70
輸出樣例#1:
MONKEYKING
ULTRAMAN
SUPERMAN
CAPTAINAMERICA
BATMAN
DORAEMON
IRONMAN
WOLVERINE
MAGNETO
HIPPOPMAN
輸入樣例#2:

輸出樣例#2:

輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
const int N=101;
struct hero{
	string name;
	int a, b, rp, sum; 
};
bool cmp(const hero&a, const hero&b){
	if(a.sum>b.sum)	return true;
	if(a.sum<b.sum)	return false;
	if(a.rp>b.rp)	return true;
	if(a.rp<b.rp)	return false;
	if(a.a>b.a)	return true;
	if(a.a<b.a)	return false;
	if(a.name<b.name) return true;
	return false;
}
int main(){
	int n;
	hero h[N];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>h[i].name;
		cin>>h[i].a;
		cin>>h[i].b;
		cin>>h[i].rp;
		h[i].sum = h[i].a+h[i].b+h[i].rp;
	}
	sort(h, h+n, cmp);
	for(int i=0;i<n;i++){
		cout<<h[i].name<<endl;
	}
	return 0;
}
  1. 最長上升子序列之簡單版
題目描述
由n個整陣列成的數列,記為b[1], b[2], …, b[n]。若存在i1<i2<i3< … < ie 且有b[i1]< b[i2]< … <b[ie]則稱為長度為e的上升子序列。求最長上升 。求最長上升子序列(Longest increasing subsequence, LIS)
輸入輸出格式
輸入格式
輸入檔案lis.in 輸入一行整數序列,由空格隔開。說明:序列長度<=100, 每個整數絕對值<=10000。
說明:輸入可以用以下程式碼:
int n=0;
while( cin>>x[n+1] ) n++ ;
輸出格式
輸出檔案lis.out 輸出一個整數。
輸入輸出樣例
輸入樣例#1:
2 1 1 2 3
輸出樣例#1:
3
輸入樣例#2:
1 2 3 4 5 6 5
輸出樣例#2:
6
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
using namespace std;
const int N=109;
int n=0,x[N],f[N];
int main(){
    freopen("lis.in", "r", stdin);
    freopen("lis.out", "w", stdout);
	while(cin>>x[n+1])n++;
	f[0]=0;
	for(int i=1;i<=n;i++){
		f[i]=1;
		for(int j=1;j<i;j++)
		    if(x[j]<x[i])
		        f[i]=max(f[i],f[j]+1);
	}
	int ans=*max_element(f+1,f+1+n);
	cout<<ans;
	return 0;
}
  1. 命運卡牌
題目描述
小明最近運氣不好想找大師求教,大師拿出一副卡 牌,共100張牌,每張正面有一個數字分別為1到100的整數,背面寫有一些人生哲理。 大師問,“小明 你的幸運數字是哪個?” 小明說,“當然是6666。” 大師心算很快,“如果要用卡牌裡兩個數字的乘積湊出6666,最接近的方法是68乘以98。所以這兩張牌 就是你的命運卡牌,牌背後的人生哲理送給你。”  但是大師馬上就要變老腦子變慢,請幫大師寫一個 程式能為客人計算兩張命運卡牌,輸入一個數字n代表客人的幸運數字,輸出兩個不同數字乘法形式, 兩數乘積是所有可能中最接近n的。先輸出較小的數。如果有多種可能,輸出兩數裡較小數最小的方案 。
輸入輸出格式
輸入格式
輸入檔案destiny.in 輸入一個數字n,n<=10000
輸出格式
輸出檔案destiny.out 輸出一行字串。
輸入輸出樣例
輸入樣例#1:
6666
輸出樣例#1:
68*98=6664
輸入樣例#2:

輸出樣例#2:

輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("destiny.in", "r", stdin);
	freopen("destiny.out", "w", stdout);
	int n,x,y;
	cin>>n;
	int bst=10000;
	for(int i=1;i<=99;i++)
	    for(int j=i+1;j<=100;j++){
	    	int d=abs(i*j-n);
	    	if(d<bst){
	    		bst=d;
	    		x=i;y=j;	    		
			}
		}
	cout<<x<<"*"<<y<<"="<<x*y;
	return 0;
}
  1. 比例簡化
題目描述
在社交媒體上,經常會看到針對某一個觀點同意與 否的民意調查以及結果。例如,對某一觀點表示支 持的有1498 人,反對的有 902人,那麼贊同與反對的比例可以簡單的記為1498:902。 不過,如果把調查結果就以這種方式呈現出來,大多數人肯定不會 滿意。因為這個比例的數值太大,難以一眼看出它 們的關係。對於上面這個例子,如果把比例記為5:3,雖然與真實結果有一定的誤差,但依然能夠較為 準確地反映調查結果,同時也顯得比較直觀。 現給出支援人數A,反對人數B,以及一個上限L,請你將A比B化簡為A’比B’,要求在A’和B’均不大於L且A’和B’互質(兩個整數的最大公約數是1)的前提下,A’/B’≥ A/B且A’/B’- A/B的值儘可能小。 (本題目為2014NOIP普及T2)
輸入輸出格式
輸入格式
輸入檔案ratio.in 輸入共一行,包含三個整數A,B,L,每兩個整數之間用一個空格隔開,分別表示支援人數、反對人數以及上限。
說明 1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,A/B ≤ L。
輸出格式
輸出檔案ratio.out 輸出共一行,包含兩個整數A’ ,B’,中間用一個空格隔開,表示化簡後的比例。
輸入輸出樣例
輸入樣例#1:
1498 902 10
輸出樣例#1:
5 3
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("ratio.in", "r", stdin);
	freopen("ratio.out", "w", stdout);
	int L,x,y;
	double a,b;
	cin>>a>>b>>L;
	double ratio=a/b;
	double bst=L;
	for(int i=1;i<=L;i++)
	    for(int j=1;j<=L;j++){
	    	double d=i*1.0/j-ratio;
			if(d>=0&&d<bst){
				bst=d;
				x=i;y=j;
			}
		}
	cout<<x<<" "<<y;
	
	return 0;
}