緊跟時事:Netflix 計劃推出 “散戶大戰華爾街”電影
問題 A: Hanoi雙塔問題
題目描述
楚繼光:“防禦系統還真有用,修羅王的魔法炮陣的火力果然減弱了,但好像還差一點點啊?”
墨老師:“哦,是嗎,那試試雙塔防禦體系吧。”
不玩梗渾身難受
如圖所示,給定A,B,C三根足夠長的細柱,在A柱上放有2n箇中間有空的能量圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的,圖為n=3的情形。現要將這些圓盤移到C柱上,在移動過程中可放在B柱上暫存。每次只能移動一個圓盤,每個柱子的圓盤保持上小下大的順序。要求輸出最少移動次數。
輸入
一個正整數,表示A柱上有2n個圓盤。
輸出
僅一行,包含一個正整數,為最少移動次數。
樣例輸入Copy
2
樣例輸出Copy
6
提示
對於100%資料,1≤n≤200。
//這其實就是漢諾塔然後乘以二
//然後不用模擬的話直接找規律也不是不行
//然後long long只到2的64次方 所以碰到200會炸 大整數
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int a[205] = {0};
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n; cin>>n;
int m = n - 1; a[1] = 1;
while(m--)
{
for(int i = 1; i <= 200; i++)
{
a[i] *= 2;
a[1]++;
for(int i = 1; i <= 200; i++)
{
if(a[i] >= 10)
{
a[i + 1] += (a[i] / 10);
a[i] %= 10;
}
}
}
for(int i = 1; i <= 200; i++)
{
a[i] *= 2;
}
for(int i = 1; i <= 200; i++)
{
if(a[i] >= 10)
{
a[i + 1] += (a[i] / 10);
a[i] %= 10;
}
}
for(int i = 200; i >= 1; i--)
{
if(a[i])
{
for(int j = i; j >= 1; j--)
{
cout<<a[j];
}
cout<<'\n';
break;
}
}
return 0;
}
temp + 1 + temp這個思路其實是對的 WA是因為後來輸出的時候cout<<a[i]了
其實和2^n這種思路說不上誰會更好
所以都拿出來了
反正都能過
//這其實就是漢諾塔然後乘以二
//然後不用模擬的話直接找規律也不是不行
//然後long long只到2的64次方 所以碰到200會炸 大整數
//temp + 1 + temp相對於2的n次方減一簡直是拉跨
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int a[205] = {0};
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n; cin>>n;
a[1] = 1;
while(n--)
{
for(int i = 1; i <= 200; i++)
{
a[i] *= 2;
}
for(int i = 1; i <= 200; i++)
{
if(a[i] >= 10)
{
a[i + 1] += (a[i] / 10);
a[i] %= 10;
}
}
}
if(a[1]) a[1]--;
else
{
for(int i = 2; i <= 200; i++)
{
if(a[i])
{
a[i]--;
for(int j = 1; j <= i - 1; j++) a[j] = 9;
break;
}
}
}
for(int i = 1; i <= 200; i++)
{
a[i] *= 2;
}
for(int i = 1; i <= 200; i++)
{
if(a[i] >= 10)
{
a[i + 1] += (a[i] / 10);
a[i] %= 10;
}
}
for(int i = 200; i >= 1; i--)
{
if(a[i])
{
for(int j = i; j >= 1; j--)
{
//cout<<a[i];啊這
cout<<a[j];
}
cout<<'\n';
break;
}
}
return 0;
}
問題 B: 紀念品分組
題目描述
元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多隻能包括兩件紀念品, 並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在儘量短的時間內發完所有紀念品,樂樂希望分組的數目最少。
你的任務是寫一個程式,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
輸入
輸入包含n+2行:
第1行包括一個整數w,為每組紀念品價格之和的上限; 第2行為一個整數n,表示購來的紀念品的總件數G
第3-n+2行每行包含一個正整數Pi (5 <= Pi <= w)w表示所對應紀念品的價格。
100%的資料滿足: 1 <= n <= 30000, 80 <= w <= 200
輸出
僅1行,包含一個整數, 即最少的分組數目
樣例輸入Copy
100 9 90 20 20 30 50 60 70 80 90
樣例輸出Copy
6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int a[30005] = {0};
int b[30005] = {0};
int main()
{
ios::sync_with_stdio(false),cin.tie(NULL);
int n,m; cin>>n>>m;
for(int i = 1; i <= m; i++) cin>>a[i];
sort(a + 1, a + 1 + m);
int s = 1; int e = m; int ans = 0;
while(s < e)
{
if(a[s] + a[e] <= n)
{
b[s] = 1; b[e] = 1;
ans++;
s++; e--;
}
else e--;
}
for(int i = 1; i <= m; i++)
{
if(!b[i]) ans++;
}
cout<<ans<<'\n';
return 0;
}