Prateek希望在他的生日那天为他的N个朋友举办派对,每个朋友的编号从1到N.他的朋友们要求送礼来参加聚会,而不是给他一个。礼物的费用在数组中给出值,其中ith朋友要求礼物,费用为Costi。但是,Prateek只有X金额花在礼物上,他想邀请他的朋友们在连续的范围内,这样朋友的礼物费用总和将完全等于X.
如果他可以邀请能够满足上述条件的朋友,则打印YES,否则打印NO。
Input:
第一行包含一个整数T,表示测试用例的数量。在每个测试用例中,将出现以下输入: - 下一行包含两个以空格分隔的整数N和X,其中N表示朋友的数量,X表示Prateek可以在礼物上花费的金额。 - 下一行N行包含N个整数,其中第i行包含第i个整数,表示Costi。
Ouput
准确输出T行,每行包含相应测试用例的答案。
Constraints:
1 <= T <= 10
1 <= N , Costi <= 106
1 <= X <= 1012
Sample Input(Plaintext Link)
1
5 12
1
3
4
5
2
Sample Output(Plaintext Link)
YES
MyApproach
我按照所说的接受输入并为每个元素取得了subarry sum。但我没有得到预期的输出。
public static void counCondition()
{
boolean b1=false;
int Sum=0;
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
for(int i=1;i<=T;i++)
{
sc.nextLine();
String nextLine = sc.nextLine(); //@Edited my mistake
String[] input = nextLine.split("\\s+");
int p = Integer.parseInt(input[0]);
int c = Integer.parseInt(input[1]);
int Cost[]=new int[p];
for(int j=0;j<Cost.length;j++)
{
Cost[j]=sc.nextInt();
}
for(int k=0;k<Cost.length;k++)
{
Sum=0;
for(int l=k;l<p;l++)
{
Sum=Sum+Cost[l];
if(Sum>c)
{
break;
}
else if(Sum==c)
{
b1=true;
break;
}
}
}
if(b1==true)
{
System.out.println("YES");
}
else
{
System.out.println("NO");
}
}
sc.close();
}
// @编辑输出仍然相同。
**ActualInput** **ExpectedInput**
1 1
5 12 5 12
1 1
3 3
4 4
5 5
2 2
6
7
8
9
2
**ActualOutput** Expected Output(Plaintext Link)
NO YES
我不期待这个输出。
任何人都可以指导我为什么吗?
答案 0 :(得分:1)
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1 在app.HackerEarth25Dec2015.counCondition(HackerEarth25Dec2015.java:18)
发生异常是因为您调用next()
方法而不是nextLine()
。 next()
方法返回下一个5
此处不是完整行的标记。
此外,我建议您使用扫描仪中的nextInt()
,而不是获取字符串并拆分和解析它。这将是一种更清洁的做事方式。
int p = sc.nextInt();
int c = sc.nextInt();
你的逻辑也不正确。我希望你能找到逻辑错误并修复它。
您可以使用以下代码解决问题。
sc.nextLine(); // This is to read the `\n` left from previous `nextInt()`
String nextLine = sc.nextLine();
String[] input = nextLine.split("\\s+");
答案 1 :(得分:1)
在Cost数组中获得个人成本后。 这是使连续和等于最大总和的逻辑。
保持一个起始索引变量,告诉连续序列的起始位置。在开始时它应该是零索引。
维护sum变量以跟踪总和。
运行for循环,从零到endIndex。
如果总和小于最大金额
将费用[i]添加到总和。
否则如果sum等于max sum,则打破for循环
否则,如果总和大于最大值
现在从startIndex中删除元素,直到sum再次使用while循环变得小于或等于max sum。
while(sum&gt; maxSum)
sum = sum - cost [startIndex]
增加startIndex
while循环完成
如果sum等于maxsum,打破你得到答案的循环
否则继续外部for循环。
这种逻辑的想法是,每当总和增加最大值时,一直从总和中删除元素。
答案 2 :(得分:1)
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t>0)
{
int n=sc.nextInt();
long x=sc.nextLong();
long[] money=new long[n];
for(int i=0;i<n;i++)
{
money[i]=sc.nextInt();
}
long sum;
int c=0;
sum=money[0];
for(int i=1;i<n;i++)
{
if(sum<x)
sum=sum+money[i];
else if(sum==x)
break;
while(sum>x)
{
sum=sum-money[c];
c++;
}
}
if(sum==x)
System.out.println("YES");
else
System.out.println("NO");
t--;
}
此处http://jayarampandava.blogspot.in/2015_10_01_archive.html 你可以找到实际的解决方案