既然不能解决眼前的苟且,就先把诗和远方放一放!加油吧,我的喵小姐!
2、纸牌游戏
首先认真看题:1)时间限制为1s,不适合用循环;2)双方均最优-即如果是按从大到小的顺序排下来,则应该是一正一负依次加起来即可。所以现在问题的关键就是如何使输入的数据有序?此时,我首先想到的是各种排序方法,但是它们均用到了循环,时间上肯定不满足,而且依我自己的直觉,总觉得不能使用内置的排序函数,所以尽管不能用循环,我也只能用循环了...
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int a[]=new int[n];
int i,j,temp,sum=0;
for(i=0;i<n;i++){
a[i]=sc.nextInt();
}
for(i=0;i<n-1;i++){//冒泡排序
for(j=i+1;j<n;j++){
if(a[i]<a[j]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
if(i%2==0){
sum=sum+a[i];
}else{
sum=sum-a[i];
}
}
if(n%2==0){//最后一个数
sum=sum-a[i];
}else{
sum=sum+a[i];
}
System.out.println(sum);
}
}
嗯,没错,确实不满足时间要求!
然后我开始查网上各种排序方法,看哪个时间复杂度最低,但是不管哪个,绝对时间上都不满足,于是在网上搜其他人怎么做,关键看大家是如何排序的?因为如果不能使用内置函数的话,我觉得只能用排序方法,而各种排序都会超时,结果我发现原来大家都是用的内置函数,即Arrays.sort()
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int a[]=new int[n];
int i,sum=0;
int flag=1;//控制符号
for(i=0;i<n;i++){
a[i]=sc.nextInt();
}
Arrays.sort(a);//得到的数组是按从小到大排列的
for(i=n-1;i>=0;i--){//最后一个数是最大的,为正,依次为负、正...
sum=sum+a[i]*flag;
flag=flag*(-1);
}
System.out.println(sum);
}
}
over!所有样例运行正确
(接下来要好好做一次各种排序的总结了!)