還有兩題放在最後寫,不是說它難,而是它有問題。基本可以確定防禦力是錯了,答案沒有按照字典序排序。然後去知乎翻了一波往年的評價,發現那次比賽有三次勘誤,可能包括這個(因為也沒有人提到)。採油這題無意中發現有人說了做法,但是其實是有缺陷的,雖然可以過藍橋杯的資料,但是構造了一組樣例把它hack了。所以可能是資料比較弱。也可能是我太菜了,沒理解到題目意思。暫時沒有想到比較好的方法過這題,先放個防禦力的題解。
題目描述
小明最近在玩一款遊戲。對遊戲中的防禦力很感興趣。
我們認為直接影響防禦的引數為「防禦效能」,記作d,而面板上有兩個防禦值a和b,與d成對數關係,a=2
d,b=
3d
a=2^d,b=3^d
a=2d,b
=3d(注意任何時候上式都成立)。
在遊戲過程中,可能有一些道具把防禦值a增加乙個值,有另一些道具把防禦值b增加乙個值。
現在小明身上有n1個道具增加a的值和n2個道具增加b的值,增加量已知。
現在已知第i次使用的道具是增加a還是增加b的值,但具體使用那個道具是不確定的,請找到乙個字典序最小的使用道具的方式,使得最終的防禦效能最大。
初始時防禦效能為0,即d=0,所以a=b=1。
輸入
輸入的第一行包含兩個數n1,n2,空格分隔。
第二行n1個數,表示增加a值的那些道具的增加量。
第三行n2個數,表示增加b值的那些道具的增加量。
第四行乙個長度為n1+n2的字串,由0和1組成,表示道具的使用順序。0表示使用增加a值的道具,1表示使用增加b值的道具。輸入資料保證恰好有n1個0,n2個1。
輸出
對於每組資料,輸出n1+n2+1行,前n1+n2行按順序輸出道具的使用情況,若使用增加a值的道具,輸出ax,x為道具在該類道具中的編號(從1開始)。若使用增加b值的道具則輸出bx。最後一行輸出乙個大寫字母e。
樣例輸入
1 24
2 8101
樣例輸出
b2a1b1e
思路
這種題目很顯然是貪心題。然後樣例給了乙個提示,b類道具從大到小使用。那麼我們再看看a類道具的順序,證了半天,發現很不好算,所以就不放了。(其實是沒有化出來,不想寫了) 最簡單的方法就是帶幾個數字進去,發現a類道具從小到大使用結果更大。貪心題吧,你要證出來確實要花很多功夫。但是要是舉幾個例子來判斷這樣對不對還是很好做的。
然後你就得到了理論正確,但是過不了的**。然後去網上找了一番之後發現有人是用不排序寫的,我也挺納悶的,題目明明說了要按字典序排序,所以我覺得可能是比賽的時侯勘誤了,不然一般人也不會這樣寫。
放個可以ac的**。
#
include
using
namespace std;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;const
double pi =
acos(-
1);namespace}#
define
fioios::
sync_with_stdio
(false
);cin.
tie(0)
;cout.
tie(0)
;#define
_for
(n,m,i)
for(
register
int i =
(n); i <
(m);
++i)
#define
_rep
(n,m,i)
for(
register
int i =
(n); i <=
(m);
++i)
#define
_srep
(n,m,i)
for(
register
int i =
(n); i >=
(m); i--)#
define
_sfor
(n,m,i)
for(
register
int i =
(n); i >
(m); i--)#
define
lson
rt <<
1, l, mid
#define
rson
rt <<1|
1, mid +
1, r
#define
lowbit
(x) x &
(-x)
#define
piipair<
int,
int>
#define
fifirst
#define
sesecond
const
int n =
2e6+5;
struct
node
}e[2
][n]
;int a[2]
;string s;
vector<
int> ve;
intmain()
_rep(1
, m, i)
sort
(e[0]+
1, e[0]
+ n +1)
;sort
(e[1]+
1, e[1]
+ m +1)
; a[0]
= a[1]
=1; cin >> s;
assert
(s.size()
== n + m)
; ve.
push_back
(e[s[0]
-'0'
][a[s[0]
-'0']++
].id)
;for
(int i =
1; i < n + m; i++
)else ve.
push_back
(e[k]
[a[k]++]
.id);}
//sort(ve.begin(), ve.end());
for(
auto it : ve)
printf
("%c%d\n"
,"ab"
[s[s.
size()
-1]-
'0']
, it)
;printf
("e\n");
}
藍橋杯 2023年第九屆真題 全球變暖
你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...
藍橋杯 2023年第九屆真題 搭積木
藍橋杯 2018年第九屆真題 搭積木 小明對搭積木非常感興趣。他的積木都是同樣大小的正立方體。在搭積木時,小明選取 m 塊積木作為地基,將他們在桌子上一字排開,中間不留空隙,並稱其為第0層。隨後,小明可以在上面擺放第1層,第2層,最多擺放至第n層。擺放積木必須遵循三條規則 其中,小明不喜歡的位置都被...
藍橋杯 2023年第九屆真題 全球變暖 廣搜
你有一張某海域nxn畫素的 表示海洋 表示陸地,如下所示 其中 上下左右 四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。由於全球變暖導致了海面上公升,科學家 未來幾十年,島嶼邊緣乙個畫素的範圍會被海水淹沒。具體來說如果一塊陸地畫素與海洋相鄰 上下左右四個相鄰畫素中有海洋 它就會被淹...