题目链接:https://cn.vjudge.net/problem/HihoCoder-1835
先把圆心移动到原点,对于所求的点,一定是已知点的k维坐标同时减去一个数,找到这个能减去的最大的数就行了;
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define eps 1e-6
const int maxn=110;
int c[maxn];
int y[maxn];
int f[maxn];
int finish[maxn];
double a[maxn];
double b[maxn];
int n,k,r;
int sgn(int x){
return x >= 0 ? 1 : -1;
}
void deal(){
for(int i = 0;i < k; i++) finish[i] = 0;
double lam;
bool flag;
do{
lam = 0;
int tot = 0;
for(int i = 0; i < k; i++)
if(!finish[i]) lam += y[i], tot++;
lam = (lam - r) / tot;
flag = false;
for(int i = 0; i < k; i++){
if(finish[i]) continue;
a[i] = -lam + y[i];
if(a[i] <= 0) a[i] = 0, finish[i] = 1, flag = true;
}
}while(flag);
}
int main(){
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d", &n, &k, &r);
for(int i = 0; i < k; i++)
scanf("%d", &c[i]);
while(n--)
{
for(int i = 0; i < k; i++)
{
scanf("%d",&y[i]);
f[i] = sgn(y[i] - c[i]);
y[i] = abs(y[i] - c[i]);
}
deal();
for(int i = 0; i < k; i++)
printf("%.4f%c",a[i] * f[i] + c[i]," \n"[i == k - 1]);
}
}
return 0;
}