藍橋杯 演算法訓練 Lift and Throw

2021-07-27 05:36:17 字數 3082 閱讀 5613

演算法訓練 lift and throw  

時間限制:3.0s   記憶體限制:256.0mb

問題描述

給定一條標有整點(1, 2, 3, ...)的射線. 定義兩個點之間的距離為其下標之差的絕對值.

laharl, etna, flonne一開始在這條射線上不同的三個點, 他們希望其中某個人能夠到達下標最大的點.

每個角色只能進行下面的3種操作, 且每種操作不能每人不能進行超過一次.

1.移動一定的距離

2.把另乙個角色高舉過頭

3.將舉在頭上的角色扔出一段距離

每個角色有乙個movement range引數, 他們只能移動到沒有人的位置, 並且起點和終點的距離不超過movement range.

如果角色a和另乙個角色b距離為1, 並且角色b沒有被別的角色舉起, 那麼a就能舉起b. 同時, b會移動到a的位置,b原來所佔的位置變為沒有人的位置. 被舉起的角色不能進行任何操作, 舉起別人的角色不能移動.同時, 每個角色還有乙個throwing range引數, 即他能把舉起的角色扔出的最遠的距離. 注意, 乙個角色只能被扔到沒有別的角色佔據的位置. 我們認為乙個角色舉起另乙個同樣舉起乙個角色的角色是允許的. 這種情況下會出現3個人在同乙個位置的情況. 根據前面的描述, 這種情況下上面的兩個角色不能進行任何操作, 而最下面的角色可以同時扔出上面的兩個角色. 你的任務是計算這些角色能夠到達的位置的最大下標, 即最大的數字x, 使得存在乙個角色能夠到達x.

輸入格式

輸入共三行, 分別為laharl, etna, floone的資訊.

每一行有且僅有3個整數, 描述對應角色的初始位置, movement range, throwing range.

資料保證3個角色的初始位置兩兩不相同且所有的數字都在1到10之間.

輸出格式

僅有1個整數, 即laharl, etna, flonne之一能到達的最大距離.

樣例輸入

9 3 3

4 3 1

2 3 3

樣例輸出 15

樣例說明

一開始laharl在位置9, etna在位置4, flonne在位置2.

首先, laharl移動到6.

然後flonne移動到位置5並且舉起etna.

laharl舉起flonne將其扔到位置9.

flonne把etna扔到位置12.

etna移動到位置15.

#include #include #include #define true 1

#define false 0

#define max(a, b) a > b ? a : b

//定義陣列大小為4,從一開始,空出下標為0,方便計算

int x[4]; //三個人的位置

int l[4]; //三個人的機動性(可移動距離)

int t[4]; //三個人的拋的距離

int ans = 0; //經過操作後的最遠距離,初始化為0

int w[4]; //初始化為0,0表示可以進行操作,非零表示不可以

int p[4]; //初始化為0,表示a[i]所舉起的人

int a[4] = ; //初始化為3,表人的狀態,這裡a對應的二進位制為0011,後三位分別是三個動作:丟擲,舉起,移動。0(無意義)0(不可丟擲)1(未進行舉起)1(未進行移動)。這道題中,a只有六個可能值:0(0000)、1(0001)、2(0010)、3(0011)、4(0100)、5(0101),表示人的六種狀態

//bool型別

int near(int s)

}return false;

}//dfs深度遍歷

void dfs(int d)

for (i = 1; i <= 3; i++)

//a[i] == 1 || a[i] == 3(未進行移動且不可丟擲)

if ((a[i] & 1) && !(a[i] & 4))

x[i] -= j; //歸位

x[i] -= j; //a[i]向後移動j

if (near(x[i]) || j == l[i]) //如果a[i]移動後的位置旁邊有人或者移動距離達到上限

x[i] += j; //歸位

a[i] ^= 1; //還原為未移動}}

//a[i] == 2 || a[i] == 3 || a[i] == 5(未進行舉起)

if (a[i] & 2)}}

}//a[i] == 4 || a[i] == 5(可丟擲)

if (a[i] & 4)

x[p[i]] -= j; //歸位

x[p[i]] -= j; //a[j]向後丟擲j

if (near(x[p[i]]) || j == t[i]) //如果a[j]被丟擲後的位置旁邊有人或者丟擲距離達到上限

x[p[i]] = e; //還原a[j]為未舉起前的位置

a[i] ^= 4; //還原a[j]為可丟擲

w[p[i]] = 1; //還原a[j]為不可操作}}

}return ;

}int main()

//深度優先遍歷

dfs(1);

//輸出最遠距離

printf("%d\n", ans);

return 0;

}

藍橋杯 演算法訓練 數列

題目 演算法訓練 數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上就是 3 0,31,3 0 31,3 2,...

藍橋杯 演算法訓練 Glenbow Museum

資料規模和約定 按題目描述所示。問題描述 卡城著名的格林堡博物館是加拿大西部最大的博物館,展品涵蓋了藝術 文化史以及礦物學。如今乙個全新的展區正在被布置,它是專門為你這樣傑出的程式猿 媛 打造的。不幸的是,由於空間不足,博物館打算建造一棟新的建築來重新安置這個展區。新的建築的尺寸和容量將不同於原始的...

(藍橋杯)演算法訓練 階乘

問題描述 乙個整數n的階乘可以寫成n 它表示從1到n這n個整數的乘積。階乘的增長速度非常快,例如,13 就已經比較大了,已經無法存放在乙個整型變數中 而35 就更大了,它已經無法存放在乙個浮點型變數中。因此,當n比較大時,去計算n 是非常困難的。幸運的是,在本題中,我們的任務不是去計算n 而是去計算...