牛客網挑戰賽29A題
阿新 • • 發佈:2018-12-22
連結:https://ac.nowcoder.com/acm/contest/271/A
來源:牛客網
misaka是呱太爺爺的小粉絲,呱太爺爺有一句話說的好:"一尺之棰,日取其半,萬世不竭"。
misaka現在有 n 個呱太玩偶放在一堆,每一次操作,misaka會選擇當前個數 > 1 的一堆呱太玩偶。並將這一堆呱太玩偶分成 和 兩堆,x 是當前這一堆玩偶的個數。現在 misaka 想將玩偶分成 m 堆,其中第 i 堆呱太玩偶的個數是 ai ,你需要告訴 misaka 是否能通過若干次操作將玩偶分成指定的這 m 堆。如果可以輸出 ,否則輸出 。
1 ≤ n ≤ 1018, 1 ≤ m ≤ 105, 1 ≤ ai ≤ 1018。
這道題就是一個遞迴但是n很大所以需要簡化題目;其中就還通過m來遞迴n這就是這道題的很關鍵;
通過map來記錄m堆數的情況,然後遞迴在n的遞迴下查詢看是否存在,且合法,這個遞迴有兩種解法,
1.就是普通的遞迴寫法,往下遞迴但是要及時判斷減少遞迴時間複雜度;
2,就是使用priority_queue來判斷;
程式碼一:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<map> #include<queue> #define pi acos(-1) #define e exp(1) #define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++) #define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --) #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b)) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define eps 1e-7 #define INF 0x3f3f3f3f #define inf -2100000000 using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn = 1e5 + 10; const double EPS = 1e-10; const ll p = 1e7+9; const ll mod = 1e9+7; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} inline int read(){ int ret=0,f=0;char ch=getchar(); while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar(); while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar(); return f?-ret:ret; } ll n, m; map<ll, ll>mp; ll t = 0; void init(ll t){ if(t == 0){ cout << "ham" <<endl; exit(0); } if(mp[t]){ mp[t]--; return ; } init(t >> 1); init(t - (t >> 1)); return ; } int main(){ ios::sync_with_stdio(false); cin >> n >> m; ll sum = 0; ll a; for(int i = 0; i< m; i++){ cin >> a; sum += a; mp[a]++; } if(sum != n){ cout << "ham" << endl; return 0; }else{ init(n); cout << "misaka" << endl; } return 0; }
程式碼二:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<map> #include<queue> #define pi acos(-1) #define e exp(1) #define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++) #define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --) #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b)) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define eps 1e-7 #define INF 0x3f3f3f3f #define inf -2100000000 using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn = 100 + 10; const double EPS = 1e-10; const ll p = 1e7+9; const ll mod = 1e9+7; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} inline int read(){ int ret=0,f=0;char ch=getchar(); while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar(); while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar(); return f?-ret:ret; } ll n,m; map<ll, ll>mp; int main(){ ios::sync_with_stdio(false); mp.clear(); cin >> n >> m; ll x; for(int i = 0; i < m; i++){ cin >> x; mp[x] ++; } priority_queue<ll, vector<ll> >q; q.push(n); while(!q.empty()){ ll t = q.top(); q.pop(); if(mp[t]>0){ mp[t] --; m--; if(m==0){ break; } }else{ q.push(t>>1); q.push(t-(t>>1)); if(q.size() > m){ break; } } } if(q.empty() && m == 0){ cout << "misaka" << endl; }else{ cout << "ham" << endl; } return 0; }