1. 程式人生 > >牛客網挑戰賽29A題

牛客網挑戰賽29A題

連結: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;
}