吳凡的題庫——快快程式設計151-200
阿新 • • 發佈:2022-04-12
- 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; }
- 逃難
題目描述
殭屍大戰爆發後,爺爺需要帶上值錢的財寶去逃難 ,他的每個寶物都有各自的價錢和重量。爺爺請你 幫他對所有寶物進行排序。越值錢的排在越靠前, 如果價錢一樣重量越小越靠前。如果價錢和重量都 一樣,那麼編號越小越靠前。
輸入輸出格式
輸入格式
輸入檔案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;
}
- 英雄榜
題目描述
人們在評選世界上的超級英雄們哪個更厲害,通過 投票對英雄的攻擊力,防禦力,人品這三個方面進 行了打分。現在請你將投票結果進行排序:三項總 分越高排名越靠前;總分相同時,人品越高排名越 靠前;若總分和人品都相同,攻擊力越高排名越高 ;若總分,人品,攻擊力和防禦力都相同,按照英 雄名稱的字典序排列。
輸入輸出格式
輸入格式
輸入第一行為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;
}
- 最長上升子序列之簡單版
題目描述
由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;
}
- 命運卡牌
題目描述
小明最近運氣不好想找大師求教,大師拿出一副卡 牌,共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;
}
- 比例簡化
題目描述
在社交媒體上,經常會看到針對某一個觀點同意與 否的民意調查以及結果。例如,對某一觀點表示支 持的有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;
}