牛客小白月赛4 A 三角形
题面:
链接:https://www.nowcoder.com/acm/contest/134/A 来源:牛客网 题目描述 铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起 在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形, 这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形 的周长是多少? 输入描述: 第一行两个整数n和q。(1 ≤ n, q ≤ 105) 第二行n个整数表示第i根木棍的长度ai。(1 ≤ ai ≤ 109) 接下来q行,每行一个整数表示被顺溜偷走的木棍编号。注意每行的事件是独立的,也就是说每一次操作都是对于原来的n根木棍进行的。 输出描述: 对于每个询问输出一行表示答案,如果删除木棍后无法组成三角形则输出 -1 。 示例1 输入 复制 6 2 1 2 3 4 5 6 6 5 输出 复制 12 13
题解+AC代码
首先将木棍按长度排序,可以确定的是可以组成的最大三角形的三根木棍就是连着的三个如果偷走的木棍不是这三根木棍中的其中一个,那么答案显然,否则分类处理一下。
#include<iostream>
#include<cstring>
#include<cstdbool>
#include<algorithm>
using namespace std;
int n, p;
struct node
{
long long x, y;
}a[100005],b[100005];
bool com(node p, node q)
{
return p.y > q.y;
}
int main()
{
while (cin >> n >> p)
{
for (int i = 0; i < n; ++i)
{
cin >> a[i].y;
a[i].x = i+1;
}
for (int i = 0; i < n; ++i)
b[i] = a[i];
sort(b, b + n,com);
int ans = 0,ant = 1, off = 0;
if (n < 4)
ant = 0;
while (p--)
{
cin >> ans;
long long nod[5];
if (ant)
{
int flag = 1;
for (int i = 0; i < n ; ++i)
{
if (b[i].x != ans)
{
nod[flag] = b[i].y;
++flag;
if (flag == 4)
{
if (nod[1] < nod[2] + nod[3])
{
off = 1;
break;
}
else
{
nod[1] = nod[2];
nod[2] = nod[3];
nod[3] = 0;
flag = 3;
}
}
}
}
}
if (ant&&off)
cout << nod[1] + nod[2] + nod[3] << endl;
else
cout << -1 << endl;
}
}
return 0;
}
一不小心,写了69行,太长了,我不开心。等我看完代码简洁之道再优化吧。
我想要变得高一点,最好能伸手给你一片天。