伊娃喜欢从整个宇宙中收集硬币。
有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。
但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。
给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。
输入格式
第一行包含两个整数 N 和 M,分别表示硬币数量以及需要支付的金额。
第二行包含 N 个整数,表示每个硬币的面额。
输出格式
输出一行,包含两个整数 V1,V2,表示所选的两个硬币的面额,使得 V1≤V2 并且 V1+V2=M。
如果答案不唯一,则输出 V1 最小的解。
如果无解,则输出 No Solution
。
数据范围
1≤N≤100000,
1≤M≤1000
输入样例1:
8 15
1 2 8 7 2 4 11 15
输出样例1:
4 11
输入样例2:
7 14
1 8 7 2 4 11 15
输出样例2:
No Solution
import java.util.*;
public class Main
{
public static void main(String[] args) throws Exception
{
Scanner in=new Scanner(System.in);
Boolean flag=false;
int n=in.nextInt(),m=in.nextInt();
int[] values=new int[n];
for(int i=0;i<n;i++)
values[i]=in.nextInt();
Arrays.sort(values);
for(int i=0,j=values.length-1;i<values.length;i++)//然后将前面的下标向后移动
{
while(j>=0 && values[j]+values[i]>m) j--;//将末尾数值调整到符合条件的临界值
if(j!=-1 && j != i && values[j]+values[i]==m)
{
flag=true;
System.out.printf("%d %d",values[i],values[j]);
break;
}
}
if(!flag) System.out.printf("No Solution");
}
}
解析
相关联的知识:
java 数组排序方法
包名:java.util.Arrays
方法:*Arrays.sort();
用这个方法可以快速对输入的数字进行排序
解题思路:
首先接收输入的信息
然后利用java util包中的Arrays类里面的sort方法进行快速排序
然后就是利用类似穷举法的方法找出答案了
首先用两个整形变量做下标,一个用于指向首位,一个用于指向末尾
第一阶段是将指向末尾的下标向前移动,当min+max<=m时停止移动末尾
第二阶段是将指向首位的下标向后移动,当其结果符合题解时停止循环并输出答案
My Mistakes
-
I tried to creat a very long int Array,and using a for circulate to initialize the array to make sure that the zeros will not make trouble.
That stupid method caused an error which named “TIME_OUT”
Next time
- I will know that I can use a variable to creat a new array
- I can use the powerful method in java.util.Arrays which named sort()