问题 L: 寄蒜几盒?
时间限制: 4 Sec 内存限制: 128 MB
提交: 132 解决: 50
提交 状态 讨论版
命题人:admin
题目描述
现在有一个圆圈,圆圈上有若干个点,请判断能否在若干个点中选择三个点两两相连组成一个等边三角形?
这若干个点在圆圈上按顺时针顺序分布。
如果可以的话输出"Yes"(不含引号)
不可以的话输出"No"(不含引号)
输入
第一行一个整数n,表示圆圈上有n个点
第二行n个整数,分别表示第1个点与第2个点之间圆弧的长度、第2个点与第3个点之间圆弧的长度······第n个点与第1个点之间圆弧的长度
3 <= n <= 10^6
1 <= x_i <= 1000 ( 1 <= i <= n)
输出
如果可以组成等边三角形则输出"Yes"(不含引号)
否则输出"No"(不含引号)
样例输入
样例输入1: 4 1 1 2 2 样例输入2: 8 4 2 4 2 2 6 2 2
样例输出
样例输入1: Yes 样例输入2: Yes
提示
对于样例2配图:
这个题的思路感觉还是很容易想出来的的,如果能够组成等边三角形的话,那么圆的周长肯定可以平均分成3等份,剩下的很容易想到的就是枚举每一个点,看是否存在和他距离为三分之一周长的点,如果存在说我们已经找到第二个点,然后我们继续按照这个方法寻找第三个点,如果能找到,就可以,否则不行,只不过这个方法比较费时,但是看一下题目的时间限制明显是暗示我们暴力
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<stack>
using namespace std;
typedef long long int LL;
const int N = 1e6 + 5;
int x[N];
LL sum = 0;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &x[i]);
sum += (x[i]);
}
LL dis = 0;
if (sum % 3 == 0) {//判断是否可以被3整除
LL rest = sum / 3;//记录边长
for (int i = 0; i < n;i++) {
int j = i;
while (dis < rest) {//这个while循环用于定位到与当前点的距离大于等于rest的点
dis += (x[j]);
j++;
if (j >= n) {
printf("No");
return 0;
break;
}
}
if (dis == rest) {//如果等于边长,则说明这个点使我们找到的第二个点,然后继续寻找第三个点,代码直接copy上面的即可
dis = 0;
while (dis < rest) {
dis += (x[j]);
j++;
if (j >= n) {
printf("No");
return 0;
break;
}
}
if (dis == rest) {
printf("Yes");
return 0;
}
else {
continue;
}
}
else {//说明大于rest
dis = 0;
continue;
}
}
}
else {
printf("No");
}
return 0;
}