NC21727. 三角形
描述
输入描述
第一行 包含一个整数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; } } } }