Good的集合

鏈接:https://ac.nowcoder.com/acm/contest/911/A
來源:牛客網

Good 的集合

題目描述
平面上給 n(3≤n≤1000) 個點,保證不存在 3 點共線,保證這些點兩兩不重合,對於一個點集 S ,如果從 S 中任意選出三個不同的點,構成的三角形重心都不是整點(橫座標,縱座標都是整數的點,稱爲整點),那麼這個點集是 good 的,輸出最大的 good 的點集大小。(注:所有點數小於等於 2 的點集都是 good 的)。
輸入描述:
第一行,一個整數 n (3≤n≤1000),表示 n 個點,之後 n 行,每行兩個整數 x[i],y[i] (0≤x[i],y[i]≤106).’
輸出描述:
輸出一個正整數表示答案。

示例1

輸入
4
0 0
0 1
1 0
1 1

輸出
4

示例2

輸入
3
0 0
1 2
2 1

輸出
2
備註:

  • 樣例 1 所有點都可以加入集合。

  • 樣例 2,如果 3 個點同時加入集合,重心爲 (1,1) 不合法,Good Set 中至多隻能 2 個點。

因爲中心要 / 3所以先直接/ 3 然後對於每種情況的個數枚舉dfs搜索

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1010;
int x[maxn], y[maxn];
int num[4][4];
int ans, n;
bool check(int s){//check符不符合條件
	for (int i = 0; i<=s; i++)
	for (int j = i+1; j<=s;j++)
	for (int k = j+1; k<=s; k++){
		int v = x[i] + x[j] + x[k];
		int u = y[i] + y[j] + y[k];
		if (v % 3 == 0 && u % 3 == 0) return 0;
	}
	return 1;
}
void dfs(int s){
	ans = max(ans, s);
	if (s > n) return;
	for (int i = 0; i < 3;i++)
	for (int j = 0; j < 3; j++){
		x[s] = i, y[s] = j;
		if (num[i][j]){//枚舉當前個數
			if (check(s)){
				num[i][j]--;
				dfs(s + 1);
				num[i][j]++;
			}
		}
	}
}
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++){
		int x, y;
		cin >> x >> y;
		x %= 3;y %= 3;
		num[x][y]++;
	}
	dfs(0);
	cout << ans << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章