问题 B: 捧杯
时间限制: 1 Sec 内存限制: 128 MB
题目描述
112就是FJNUACM分配的实验室,众所周知的是,里面有很多dalao,比如flag,
比如nightlemon。终于有一次,flag凭借着自己的实力夺冠拿到了奖杯。于是
他把奖杯带到了实验室。引起了一场腥风血雨。
由于除了几个dalao以外其他人都很弱,但是大家又都想捧一下杯,并且都想要
自己先捧杯,于是为了先后顺序争论不休。flag最后提出了一个办法就是大家
一起捧杯,于是众鶸给了大佬面子,打算一起捧杯。
但是大家都想离奖杯近一点,于是都把奖杯朝自己的方向拉,而距离奖杯越远的人
用的力气也越大。
现在假设每个人用的力气等于他距离奖杯的距离,那么告诉你每个人的坐标和
奖杯的坐标,问最后奖杯的受力方向。
输入
第一行给出一个T(T<=100)代表输入数据的组数
接下来对于每一组输入
第一行给出两个整数x0,y0(|x0|,|y0|<=100)代表奖杯所在的位置。
第二行给出一个n(1<=n<=100)代表想捧杯的人数。
接下来n行每一行给出两个整数xi,yi(|xi|,|yi|<=100),代表每个人的坐标
输出
对于每一组测试数据输出一行,包含一个向量(ai,bi)代表最后奖杯所受的合力方向
其中要求|ai|,|bi|为尽可能小的整数。ai,bi之间用一个空格隔开,不能有行末空格
样例输入
3
0 0
1
0 1
0 0
2
0 2
2 0
0 1
2
0 1
0 2
样例输出
0 1
1 1
0 1
思路:常规模拟,将所有向量首尾连接,再求出相对原点的移动方向。
注意:要以最简形式表示,0 x 要写成(0,1) 或者(0,-1)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream> // C++头文件,C++完全兼容C
#include <algorithm> // C++头文件,C++完全兼容C
#define fre freopen("in.txt","r",stdin) //以文件代替控制台输入,比赛时很常用,能缩短输入测试样例的时间
#define INF 0x3f3f3f3f
#define inf 1e60
using namespace std; // C++头文件,C++完全兼容C
#define N 100005 // 宏定义
#define LL long long //宏定义
int __gcd(int x,int y)
{
return y==0?x:__gcd(y,x%y);
}
int main()
{
/*cout<<__gcd(-1,-2)<<endl;//-1
cout<<__gcd(1,-1)<<endl; //-1
cout<<__gcd(1,1)<<endl; // 1
cout<<__gcd(3,-2)<<endl; // 1
cout<<__gcd(4,-13)<<endl; //-1*/
//fre;
int t;
scanf("%d",&t);
while(t--){
int a,b;
scanf("%d%d",&a,&b);
int n;
scanf("%d",&n);
int xx=0,yy=0;
for(int i=0; i<n; i++){
int x,y;
scanf("%d%d",&x,&y);
xx+=x; yy+=y;
}
xx-=n*a;
yy-=n*b; //分类讨论
if(xx==0&&yy==0){ //xx , yy都为0
printf("0 0\n");
}else if(xx==0){ //xx 为0
printf("0 %d\n",yy/abs(yy));
}else if(yy==0){ //yy 为0
printf("%d 0\n",xx/abs(xx));
}else{
int gcd=__gcd(abs(xx),abs(yy)); //xx , yy不为0。 注意要取 绝对值再进行求最大公因数
printf("%d %d\n",xx/gcd,yy/gcd);
}
}
}
转载请注明原文地址: https://ju.6miu.com/read-970458.html