1. 程式人生 > >2018QBXT刷題遊記(16)

2018QBXT刷題遊記(16)

【2018QBXT刷題遊記】

Day4 TEST6

T1 subset

【題目大意】求正整數集合S最大的子集H s.t.x,yH,xy<min(x,y)s.t. ∀x,y ∈ H,x ⊕ y<min⁡(x,y) (T組資料) 測試資料編號 資料範圍 1 – 4 1 ≤ N ≤ 16 5 – 10 1 ≤ N ≤ 1000 對於100%的資料:1ai109,T101 ≤ a_i ≤ 10^9,T≤10

【冷靜分析】(這道題後面竟然沒有標註今天【題目難度與順序無關】?) 那一定…… 先在草稿紙上塗塗畫畫,好像滿足這種性質的數對不多啊?? 於是找規律!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
	freopen("qaq.txt","w",stdout);
	for(int i=32;i>=1;i--)
	  for(int j=32;j>=1;j--){
	if((i^j)<min(i,j))
	  cout<<i<<" "<<j<<endl;
	} 
	
	return 0;
}

8以內的是這樣滴~ 8 15 8 14 8 13 8 12 8 11 8 10 8 9 8 8 7 7 7 6 7 5 7 4 6 7 6 6 6 5 6 4 5 7 5 6 5 5 5 4 4 7 4 6 4 5 4 4 3 3 3 2 2 3 2 2 1 1 【滑稽】此題結束,判斷二進位制位數即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
int cnt[35],n;
ll tmp,maxn;
int qwq(ll x){
	int ret=0;
	while(x){
		ret++;
		x>>=1;
	}
	return ret;
}
int main(){
	freopen("subset.in","r",stdin);
	freopen("subset.out","w",stdout);
	while(~scanf("%d",&n)){
		maxn=0;
		memset(cnt,0,sizeof(cnt));
		for(int i=1;i<=n;i++){
		scanf("%lld",&tmp);
		cnt[qwq(tmp)]++;}
		for(int i=1;i<=34;i++)maxn=maxn>cnt[i]?maxn:cnt[i];
		printf("%lld\n",maxn);
	}
	return 0;
}

開心,AC了。這次陣列終於沒開小!