鏈接: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;
}