misaka是呱太爺爺的小粉絲,呱太爺爺有一句話說的好:"一尺之棰,日取其半,萬世不竭"。
misaka現在有 n 個呱太玩偶放在一堆,每一次操作,misaka會選擇當前個數 > 1 的一堆呱太玩偶。並將這一堆呱太玩偶分成
輸入描述:
第一行兩個數 n, m 。
接下來一行 m 個數 ai 。
輸出描述:
輸出共乙個字串
輸入
4 1
5
輸出
ham
備註:
1 ≤ n ≤ 10^18, 1 ≤ m ≤ 10^5, 1 ≤ ai ≤ 10^18。
題意:給定n個物品,每次可以將物品分成數量為
題解:每次都能分成兩堆,用佇列模擬分堆,講可能出現的情況標記一下,最後與所給序列對比,如果完全一樣則輸出misaka否則輸出ham
最後還需要特判一下 所給序列的和不超過n (本以為這個和會爆ll,然而並沒有)
這個題剛開是沒想法,一直以為是找規律,主要是看到資料很大,但是沒想到他可以用佇列模擬每次一半,可以優化到log級別
另乙個坑就是容易爆記憶體,剛開始的bfs想法是
先把所出現的數都先標記一下,然後與bfs模擬出來的結果相比較,如果相同就cnt++,最後看看cnt是否等於m
然而這種想法,占用記憶體太大,,,,
總之一句話,太菜。。
#includeusing namespace std;
typedef long long ll;
#define linf 0x3f3f3f3f3f3f3f3f
ll a[100005];
mapvis;
ll cnt;
ll bfs(ll x)
return 0;
}int main()
if(sum!=n)
bfs(n);
int flag=1;
for(int i=1; i<=m; i++)
}if(flag)printf("misaka\n");
else printf("ham\n");
return 0;
}
11 22A 御阪美琴 優先佇列模擬
misaka是呱太爺爺的小粉絲,呱太爺爺有一句話說的好 一尺之棰,日取其半,萬世不竭 misaka現在有 n 個呱太玩偶放在一堆,每一次操作,misaka會選擇當前個數 1 的一堆呱太玩偶。並將這一堆呱太玩偶分成 第一行兩個數 n,m 接下來一行 m 個數 ai 輸出共乙個字串 表示 misaka ...