BestCoder-Round#33
寫(xiě)在前面
- 這是我第一次做BestCoder, 熟悉了一下BestCoder的模式.
- BC上并不是只能看英文, 后面的Chinese view下的鏈接是中文題目
- 交的次數(shù)是會(huì)影響得分的. 所以有了把握再交. 至少樣例要過(guò)吧.
- 一定要考慮所有特殊情況, 因?yàn)橛性S多積極的Hacker正等著你上鉤. 即使交過(guò)Accepted之后一旦被Hack成功一分都沒(méi)有. 唉…
- 我的第一次BestCoder比賽就以?xún)蓚€(gè)題被Hack兩個(gè)題不會(huì)結(jié)束了.
- 感覺(jué)BestCoder的比賽還是很刺激的. 拼手速, 拼細(xì)心, 拼代碼能力.
- 題目: http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=571
賽后題解
第一題字符串, 但我發(fā)現(xiàn)我字符串的基本功還是不行啊, 做了近一個(gè)小時(shí)(一開(kāi)始不知道有中文題面, 到處找翻譯也費(fèi)了不少時(shí)間), 還是看別人代碼打的.
- 不能輸出前導(dǎo)零
- 結(jié)果是0也不能不輸出
- 被hack后改呀改, 終于發(fā)現(xiàn)我在輸出時(shí)如果數(shù)字大于10也用的+’0’輸出…
第二題倒是挺順利的想到解法. 首先, 拐點(diǎn)一定是1或者n. 把1作為拐點(diǎn)時(shí), 假設(shè)1在第i個(gè)位置上, 除了1之外還有n-1個(gè)數(shù)字, 1的左面可以從n-1個(gè)數(shù)字中任選i-1個(gè)數(shù)字, 而且有且只有一種排法(遞減), 選完左側(cè)右側(cè)也就確定了, 且也只有一種排法(遞增). 而把n當(dāng)作拐點(diǎn)的排法總數(shù)和1時(shí)相等, 同時(shí)要注意到1, 2, …, n 和 n, n-1, …, 1 的排列被計(jì)算了兩次. 總結(jié)果要減去2. 那么總的排法就是
ans=2?∑i=0n?1C(n?1,i)?2=2?2n?1?2=2n?2
如果在比賽時(shí)想到這里就提交, 你會(huì)發(fā)現(xiàn)你A了, 但如果你在Hack的時(shí)間時(shí)去群里看一下, 就會(huì)發(fā)現(xiàn)事情并不單純.- 當(dāng)n = 1時(shí), 總的排法應(yīng)該是 1 而不是 2^1 - 2 = 0. 全部遞增的序列和全部遞減的序列并沒(méi)有被算兩次. 因?yàn)樗还簿鸵粋€(gè)序列.
所以要加特判, n=1時(shí)輸出 1
完了嗎? 沒(méi)有…(hack好強(qiáng)大) - 因?yàn)閿?shù)據(jù)范圍很大, 10^18, long long ? 但是乘法時(shí)可能溢出, 所以還需要寫(xiě)快速乘, 在矩陣乘法的題里曾用到過(guò). 我當(dāng)時(shí)猶豫要不要寫(xiě), 但看到第一次提交AC后就沒(méi)有寫(xiě). 我當(dāng)時(shí)還不知道hack有多強(qiáng)大.
到這里, 所有問(wèn)題應(yīng)該都解決了吧?
唉, 又調(diào)了好半天. 各種習(xí)慣不好導(dǎo)致的錯(cuò)誤 - 首先 n=1 時(shí)不能簡(jiǎn)單的輸出1, 因?yàn)閙還可能等于1
- 然后, 記得把所有變量都開(kāi)long long
- 最后一個(gè)是我犯的錯(cuò)誤, 在快速冪和快速乘的時(shí)候我先把傳入的兩個(gè)參數(shù)都模了…&%#……
- 當(dāng)n = 1時(shí), 總的排法應(yīng)該是 1 而不是 2^1 - 2 = 0. 全部遞增的序列和全部遞減的序列并沒(méi)有被算兩次. 因?yàn)樗还簿鸵粋€(gè)序列.
A, B題都是基礎(chǔ)的東西, 但掌握的都不好
覺(jué)得做BestCoder很刺激樣子.
第三題后來(lái)看別人的代碼弄明白了. 用map實(shí)現(xiàn)的DP
- 先按照解決問(wèn)題最早開(kāi)始的時(shí)間先后排序
- 用 map<int, long long> f[2] 來(lái)記錄狀態(tài). map是當(dāng)前時(shí)間到最大分?jǐn)?shù)的映射. f[2] 是滾動(dòng)數(shù)組.
- 如果選擇放棄解決當(dāng)前的問(wèn)題, 就從上個(gè)狀態(tài)的時(shí)間轉(zhuǎn)移到當(dāng)前狀態(tài)的時(shí)間即可, 分?jǐn)?shù)不變.
- 如果選擇解決當(dāng)前問(wèn)題, 就從上個(gè)狀態(tài)的一個(gè)時(shí)間(pre_t)轉(zhuǎn)移到當(dāng)前狀態(tài)的一個(gè)合法時(shí)間, 分?jǐn)?shù)加上當(dāng)前問(wèn)題的分?jǐn)?shù). 這里需要考慮哪個(gè)時(shí)間是合法的, 如果pre_t加上任務(wù)所需時(shí)間早于最早完成時(shí)間, 就轉(zhuǎn)移到最早完成時(shí)間, 否則轉(zhuǎn)移到pre_t加上任務(wù)所需時(shí)間.
- 用迭代器遍歷map需要滿(mǎn)足map里至少有一個(gè)元素吧. 所以先插入一個(gè)(0, 0)預(yù)處理.
- 用map實(shí)現(xiàn)的狀壓感覺(jué)好厲害…
- 還有記得該開(kāi)long long的時(shí)候就開(kāi)… 又在這里卡了一陣
賽后代碼
A: https://code.csdn.net/snippets/619782
B: https://code.csdn.net/snippets/619742
C: https://code.csdn.net/snippets/619822
比賽結(jié)果
被hack的很慘, 其實(shí)還是自己弱
總結(jié)
以上是生活随笔為你收集整理的BestCoder-Round#33的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: BZOJ-2337-XOR和路径
- 下一篇: BZOJ-2115-Xor-WC2011