/*****************************************
Author :Crazy_AC(JamesQi)
Time :2016
File Name :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <climits>
using namespace std;
#define MEM(x,y) memset(x, y,sizeof x)
#define pk push_back
#define lson rt << 1
#define rson rt << 1 | 1
#define bug cout << "BUG HERE\n"
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
typedef pair<ii,int> iii;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int nCase = 0;
int n, r;
ii p[3600];
int cnt;
vector<ii> ans, tmp;
int maxDis;
bool cmp(ii& A,ii& B) {
return A.first*A.first + A.second*A.second > B.first*B.first+B.second*B.second;
}
LL calc(ii& A,ii& B) {
return (A.first - B.first)*(A.first - B.first)
+ (A.second - B.second)*(A.second - B.second);
}
void dfs(int top) {
if (tmp.size() == n) {
LL x = 0LL;
for (int i = 0;i < n;++i)
for (int j = i + 1;j < n;++j)
x += calc(tmp[i], tmp[j]);
if (x > maxDis) {
maxDis = x;
ans = tmp;
}
return ;
}
if (top == cnt) return ;
tmp.push_back(p[top]);
dfs(top);//多选
tmp.pop_back();
dfs(top + 1);//后面不再选择p[top]这个点了
}
int main(int argc, const char * argv[])
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cin >> n >> r;
for (int i = -r;i <= r;++i)
for (int j = -r;j <= r;++j)
if (i*i+j*j <= r*r) p[cnt++] = ii(i, j);
sort(p, p + cnt, cmp);
cnt = min(cnt, 120/n);//选取最外面的几圈合法点
dfs(0);
cout << maxDis << endl;
for (int i = 0;i < n;++i)
printf("%d %d\n", ans[i].first, ans[i].second);
return 0;
}
codeforces460E(sb的贪心暴力)
最新推荐文章于 2022-07-13 18:36:20 发布