圈地运动,就是用很多木棍摆在地上组成一个面积大于0的多边形~
小明喜欢圈地运动,于是他需要去小红店里面买一些木棍,期望圈出一块地来。小红想挑战一下小明,所以给小明设置了一些障碍。障碍分别是:
1.如果小明要买第i块木棍的话,他就必须把前i-1块木棍都买下来。
2.买了的木棍都必须用在圈地运动中。
那么请问小明最少买多少根木棍,才能使得木棍围成的图形是个面积大于0多边形呢?圈地运动,就是用很多木棍摆在地上组成一个面积大于0的多边形~
小明喜欢圈地运动,于是他需要去小红店里面买一些木棍,期望圈出一块地来。小红想挑战一下小明,所以给小明设置了一些障碍。障碍分别是:
1.如果小明要买第i块木棍的话,他就必须把前i-1块木棍都买下来。
2.买了的木棍都必须用在圈地运动中。
那么请问小明最少买多少根木棍,才能使得木棍围成的图形是个面积大于0多边形呢?第一行一个数n,表示木棍个数。
第二行n个数,第i个数表示第i个木棍的长度ai
1<=n<=10000
1<=ai<=10000
输出一个数,表示最少需要的木棍个数,如果无解输出-1
3 6 8 10
3
用三根6,8,10的木棍可以组成一个直角三角形的图形。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 木棍的个数
int n = scanner.nextInt();
if(n < 3){
System.out.println(-1);
}
List<Integer> lengths = new ArrayList<>();
for (int i=0;i<n;i++){
int length = scanner.nextInt();
lengths.add(length);
}
for(int i=2;i<lengths.size();i++){
int sum = 0;
int max = 0;
for(int j=0;j<=i;j++){
if(lengths.get(j) > max){
sum = sum + max;
max = lengths.get(j);
}else{
sum = sum + lengths.get(j);
}
}
if(max < sum){
System.out.println(i+1);
break;
}else if(i== lengths.size()-1){
System.out.println(-1);
}
}
}
}
n-1边的和大于最长边,就能组成封闭多边形
import java.util.Arrays;
import java.util.Scanner;
public class 圈地问题 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
int res = angleEnable(nums);
System.out.println(res);
}
public static int angleEnable(int[] nums) {
//如果边长<2,肯定不能实现
if (nums == null || nums.length <= 2) return -1;
//条件: n-1边的和大于最长边,就能组成封闭多边形
int sum = 0; //前N个数之和
int max = 0;//前N个树中的最大值
for (int i = 0; i < nums.length ; i++) {
sum += nums[i];
max = max > nums[i] ? max : nums[i];
//如果i > 1(如果不大于1,说明只有2条边,无论如何都构成不了的)
//并且sum - max > max,即前N个中不含Max的值之和大于Max,说明找到了,直接返回
//这个注意 + 1 ,因为i从0开始
if (i > 1 && sum > 2 * max) return i + 1;
}
//遍历完所有都不存在则说明不存在
return -1;
}
}
# 思路是n-1边的和大于最长边,就能组成封闭多边形;
while 1:
try:
nums = int(input())
lists = list(map(int, input().strip().split(' ')))
if nums <= 2:
print('-1')
exit()
index = 2
for i in range(nums-2):
# 因为在前面的sum中,把最长边也加进去了,所以后面的max要乘2;
result = sum(lists[:index+1]) - max(lists[:index+1])*2
if result > 0:
print(index+1)
exit()
index += 1
print('-1')
except:
break #coding:utf-8
n = int(input())
nums = list(map(int,input().split()))
for i in range( 2,len(nums)+1):
lis = nums[0:i]
suml = sum(lis)
maxl = max(lis)
suml = suml - maxl
if suml > maxl:
print(i)
exit()
print("-1") #include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void change( int &x, int &y, int &z,const int &w){//将最短、次短、最长的棍子依次负值给x,y,z;
vector<int> rr;
rr.push_back(x);rr.push_back(y);rr.push_back(z);rr.push_back(w);
sort(rr.begin(),rr.end());
z=rr[3];y=rr[2];x=rr[0]+rr[1];
rr.clear();
rr.push_back(x);rr.push_back(y);rr.push_back(z);
sort(rr.begin(),rr.end());
z=rr[2];y=rr[1];x=rr[0];
}
int main()
{
int n;
cin>>n;
int gs[n];
for(int i=0;i<n;i++)cin>>gs[i];
int x=gs[0],y=gs[1],z=gs[2],w=0,r=3;
for(int i=3;i<n;i++){
change(x,y,z,w);
if((x+y<=z)||(z-x>=y)||(z-y>=x))//不满足三角形,将下一根棍子加入
{w=gs[i];r++;}
if((x+y>z)||(z-x<y)||(z-y<x)){//满足三角形,退出
break;
}
if(i==n-1)r=-1;
}
cout<<r;
return 0;
} //用的javascript语言
var data = [];
while(line = readline()){
data.push(line);
}
var num = data[0];
newdata = data[1].split(' ').map(a=>parseInt(a));
var result = -1;
for(var i = 3;i<=num;i++){
var max = Math.max.apply(this,newdata.slice(0,i));
var str = newdata.slice(0,i);
str.splice(newdata.indexOf(max),1);
var sum = str.reduce(function(a,b){
return a+b;
});
if(sum>max)
{result=i;break;}
}
print(result); #include <iostream>
#include <vector>
using namespace std;
int main()
{
int NumOfStick = 0; //木棍个数
cin >> NumOfStick;
int *a = new int[NumOfStick]();
for (int i = 0; i < NumOfStick; i++)
{
cin >> a[i];
}
int Max_line = a[0] > a[1] ? a[0] : a[1];
int Sum = a[0] + a[1];
int flag = 0;
for (int d = 2; d <= NumOfStick; d++)
{
if (a[d] > Max_line) //更新最大的边
{
Max_line = a[d];
}
Sum += a[d]; //前d根边的所有和
if (Sum - Max_line > Max_line)
{
cout << d + 1 << endl;
flag = 1;
return 0;
}
}
if (flag == 0)
{
cout << -1 << endl;
}
delete []a;
return 0;
}
n = int(input()) ls = list(map(int,input().split())) count = 3 pick = ls[0:3] maximum = max(pick) t_m = sum(pick) - maximum while t_m<=maximum and count<=n-1: if ls[count]>maximum: t_m += maximum maximum = ls[count] else: t_m += ls[count] count +=1 if t_m > maximum: print(count) else: print(-1)
// n-1边的和大于最长边可以构成封闭多边形
#include<bits/stdc++.h>
using namespace std;
class Solution{
public:
int getMinNum(vector<int> arr){
if(arr.size() < 3){
return -1;
}
int maxLen = INT_MIN;
int sum = 0;
for(int i=0;i<arr.size();i++){
sum +=arr[i];
maxLen = max(maxLen,arr[i]);
if(i > 1){
if(sum - maxLen > maxLen){
return i+1;
}
}
}
return -1;
}
};
int main(){
int n;
cin>>n;
vector<int> arr(n);
for(int i=0;i<n;i++){
cin>>arr[i];
}
Solution c1;
cout<<c1.getMinNum(arr)<<endl;
return 0;
} import java.util.Scanner;
/**
* @author :xbb
* @date :Created in 2020/3/27 8:58 上午
* @description:牛客网刷题
* @modifiedBy:
* @version:
*/
public class Main {
public static void main(String[] args) {
Enclosure();
}
/**
* 圈地运动链接:
* 圈地运动,就是用很多木棍摆在地上组成一个面积大于0的多边形~
* 小明喜欢圈地运动,于是他需要去小红店里面买一些木棍,期望圈出一块地来。
* 小红想挑战一下小明,所以给小明设置了一些障碍。障碍分别是:
* 1.如果小明要买第i块木棍的话,他就必须把前i-1块木棍都买下来。
* 2.买了的木棍都必须用在圈地运动中。
* 那么请问小明最少买多少根木棍,才能使得木棍围成的图形是个面积大于0多边形呢?
* 输入描述:
* 第一行一个数n,表示木棍个数。
* 第二行n个数,第i个数表示第i个木棍的长度ai
* 1<=n<=10000
* 1<=ai<=10000
* 输出描述:
* 输出一个数,表示最少需要的木棍个数,如果无解输出-1
* 示例1
* 输入
* 3
* 6 8 10
*/
private static void Enclosure() {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
if (n < 3) {
System.out.println(-1);
}
Double max = 0D;
Double sum = 0D;
for (int i = 0; i < n; i++) {
Double x = in.nextDouble();
max = max > x ? max : x;
sum += x;
if (sum-max > max) {
System.out.println(i+1);
break;
}
}
if (sum-max <= max){
System.out.println(-1);
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(solution(n, in));
}
/*
题意:输入一组数据,判断前i个数据是否能够构成多边形
如果输入的数组长度小于2肯定是不能够构成多边形的
在i>=3的条件下,如果数组前i个数的和sum减去前i个数的最大值max剩余的总和大于sum,即,sum-max>max;
则可以构成多边形,否者不可以。
*/
public static int solution(int q, Scanner in) {
int[] stick = new int[10005];
int i;
for (i = 0; i < q; i++) {
stick[i] = in.nextInt();
}
if (q <= 2) {
return -1;
} else {
int sum = stick[0];
int max = stick[0];
for (i = 1; i < q; i++) {
max = Math.max(max, stick[i]);
sum += stick[i];
if (i >= 2 && max < (sum - max)) {
return i + 1;
}
}
return -1;
}
}
} var num = readline();
var arr = readline().split(' ');
var result = getResult(num,arr);
function getResult(num,arr){
//边数大于等于3,且n条边的和减去max大于前n项的最大值max
if(num<3) return -1;
var sum = parseInt(arr[0])+parseInt(arr[1])+parseInt(arr[2]);
var max = Math.max(arr[0],arr[1],arr[2]),flag = false;
if(sum-max>max) return 3;
for(var i = 3;i<num;i++){
sum +=parseInt(arr[i]);
max = Math.max(max,arr[i]);
if(sum-max>max){
flag = true;
return i+1;
break;
}
}
if(!flag) return -1
}
console.log(result); N = int(input())
flag=1
temp = input().split(" ")
temp = list(map(int, temp))
if N < 3:
print(-1)
else:
for length in range(3,N+1):
tamp=temp[0:length]
tamp.sort()
if sum(tamp[0:-1])>tamp[-1]:
flag=0
print(length)
exit()
else:
flag=-1
if flag == -1:
print(-1)