B. Phoenix and Beauty(div2)

题目http://codeforces.com/contest/1348/problem/B
该题感觉不是很难,感觉昨天没写出来的原因主要还是贪心没用好(感觉还不够贪)
题意:该题第一行给了两个数字,第一个是已给的数组的长度,第二个是在加入一些数字后每连续n个数字的和相等,所以我当时想到的是直接是从第一个数开始遍历,得到一个有规律的数组,但是代码写出来后,没有AC
比如 5 3
4 5 5 4 4
执行代码后得到:4 1 5 4 1 5 4 1 5 4 1

//未AC
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
 public static void main(String[] args) throws IOException  {
  StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  while(in.nextToken()!=StreamTokenizer.TT_EOF) {
   for(int t=(int)in.nval;t>0;t--) {
    in.nextToken();
    int n=(int)in.nval;
    in.nextToken();
    int m=(int)in.nval;
    int arr[]=new int [n];
    Set<Integer>set=new TreeSet<>();
    for(int i=0;i<n;i++) {
     in.nextToken();
     arr[i]=(int)in.nval;
     set.add(arr[i]);
    }
    if(set.size()>m) {
     System.out.println(-1);
     continue;
    }
    if(set.size()<m) {
     for(int i=1;i<=n;i++) {
      set.add(i);
      if(set.size()==m)break;
     }
    }
    StringBuilder str=new StringBuilder("");
    int temp=arr[0];
    str.append(arr[0]);
    for(int i=1;i<n;i++) {
     int x;//找出比temp小一号的数
     if((((TreeSet<Integer>) set).lower(temp)+"").equals("null")) {
      x=((TreeSet<Integer>) set).last();
     }else {
      x=((TreeSet<Integer>) set).lower(temp);
     }
     temp=x;
     if(arr[i]==x) {
      
      str.append(" "+x);
     }else {
      
      str.append(" "+x);
      i--;
     }
     if(i==n-1)break;
    }
    System.out.println(str.length()/2+1);
    System.out.println(str);
   }
  }
 }
}

新思路:对于原来的思路主要是代码不够简洁导致出现的问题,所以可以有个使代码更简单的方法,就是直接得到规律,然后输出n个,直接解决问题
样例:5 3
4 5 4 5 4
(5 4 1)(5 4 1)(5 4 1)(5 4 1)(5 4 1)
AC代码:

package 练习;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
 public static void main(String[] args) throws IOException  {
  StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  while(in.nextToken()!=StreamTokenizer.TT_EOF) {
   for(int t=(int)in.nval;t>0;t--) {
    in.nextToken();
    int n=(int)in.nval;
    in.nextToken();
    int m=(int)in.nval;
    int arr[]=new int [n];
    Set<Integer>set=new TreeSet<>();
    for(int i=0;i<n;i++) {
     in.nextToken();
     arr[i]=(int)in.nval;
     set.add(arr[i]);
    }
    if(set.size()>m) {
     System.out.println(-1);
     continue;
    }
    if(set.size()<m) {
     for(int i=1;i<=n;i++) {
      set.add(i);
      if(set.size()==m)break;
     }
    }
    StringBuilder str=new StringBuilder("");
    int temp=((TreeSet<Integer>) set).first();
    str.append(temp+" ");
    System.out.println(set);
    for(int i=0;i<set.size()-1;i++) {
     temp=((TreeSet<Integer>) set).higher(temp);
     str.append(temp+" ");
    }
    System.out.println(set.size()*n);
    for(int i=0;i<n;i++) {
     System.out.print(str);
    }
    System.out.println();
//    int temp=arr[0];
//    str.append(arr[0]);
//    for(int i=1;i
//     int x;//找出比temp小一号的数
//     if((((TreeSet) set).lower(temp)+"").equals("null")) {
//      x=((TreeSet) set).last();
//     }else {
//      x=((TreeSet) set).lower(temp);
//     }
//     temp=x;
//     if(arr[i]==x) {
//      
//      str.append(" "+x);
//     }else {
//      
//      str.append(" "+x);
//      i--;
//     }
//     if(i==n-1)break;
//    }
//    System.out.println(str.length()/2+1);
//    System.out.println(str);
   }
  }
 }
}

你可能感兴趣的:(算法题目)