列表

详情


NC21727. 三角形

描述

小明拥有n根木棍,他将这n根木棍放在桌子上排成一排,从左到右编号为1至n。
他想知道用这n根木棍能组成的周长最大的三角形的周长是多少,就在这时小红悄悄拿走了第i根木棍,现在他想知道用剩下的这n-1个木棍中的某三根能组成的周长最大的三角形的周长是多少。

输入描述

第一行 包含一个整数t,表示测试用例的数量。
第二行 包含2个整数,第一个是n,,第二个是q,表示小红悄悄地拿走了q根木棍,每次拿走木棍的时候,她都会把之前拿走的木棍放回去(如果之前拿了木棍的话)。
第三行 包含了n个数,分别表示这n根木棍的长度
接下来 q行,每行一个整数,表示被拿走的木棍的编号。

输出描述

对于每个测试用例,先打印一行“Case #x:”,不包含双引号,其中x是测试用例编号(从1开始),然后对于每个测试用例,输出q行,第i行表示第根木棍被拿走后,剩下的n-1根木棍能组成的周长最大的三角形的周长,如果不能组成三角形则输出-1.

示例1

输入:

1
6 2
1 2 3 4 5 6
6
5

输出:

Case #1:
12
13

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 40ms, 内存消耗: 484K, 提交时间: 2018-12-23 14:46:31

#include<bits/stdc++.h>
using namespace std;
using LL=long long;

const int maxn=2010;
int a[maxn];
LL b[maxn];

int main()
{
	int T;
	scanf("%d",&T);
	int n,q,i,j,cas=1;
	int pos;
	while(T--)
	{
		scanf("%d%d",&n,&q);
		for(i=1;i<=n;i++)
			scanf("%d",a+i);
		printf("Case #%d:\n",cas++);
		while(q--)
		{
			scanf("%d",&pos);
			int cnt=1;
			for(i=1;i<=n;i++)
			{
				if(i==pos)
					continue;
				b[cnt++]=a[i];
			}
			sort(b+1,b+cnt);
			LL ans=-1;
			for(i=3;i<cnt;i++)
			{
				if(b[i]<b[i-1]+b[i-2])
				{
					ans=max(ans,b[i-1]+b[i-2]+b[i]);
				}
			}
			printf("%lld\n",ans);
		}
	}		
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 41ms, 内存消耗: 376K, 提交时间: 2019-01-22 21:31:01

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	long long int t,n,q,x,a[2005],b[2005],i,j,m=0;
	cin>>t;
	for(i=1;i<=t;i++)
	{
		cin>>n>>q;
		for(j=0;j<n;j++)
		{
			cin>>a[j];
		}
		cout<<"Case #"<<i<<":"<<endl;
		while(q--)
		{
			cin>>x;
			m=0;
			for(j=0;j<n;j++)
			{
				b[j]=a[j];
			}
			b[x-1]=0;
			sort(b,b+n);
			for(j=n-1;j>=3;j--)
			{
				if((b[j-1]+b[j-2])>b[j])
				{
					cout<<b[j-1]+b[j-2]+b[j]<<endl;
					m=1;
					break;
				}
			}
			if(m==0)
			{
				cout<<"-1"<<endl;
			}
		}
	}
}

上一题