noip2017 普及组第二题 题解

NOIP 普及组第二题 http://www.sohu.com/a/203968811_821349 图书管理员 写了 感觉还可以哦 虽然我感觉题目还是蛮简单的 看着就有思路了。而且给的数据好多都不是必须要的。

我先介绍下题目:

   图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数,图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。小D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,对于每一位读者,求出他所需要的书中图书编码最小的那本书。

题目很简单啦,就是 根据最后的图书编码匹配图书,如果有多个图书匹配,就选择最小的。 然后就是输入输出的例子

输入 n q  (n代表有n个图书编码,q代表 要匹配q个要匹配的编码,匹配最后几位就好)

eg: n=5 q=5

1.一共n 行 

1123

3123

23 

24

24

2.下面是 q行 要匹配的编码,第一个输入是下一个输入有几位,个人感觉没啥用。第二个输入要匹配的图书编码 只给了最后几位。

2    23

3   123

3   124

2   12

2  12

输出

23

1123

-1

-1

-1

匹配上了 就输出图书编码,没有匹配上就输出 -1

下面给出我程序,蛮简单的。中间踩了很多坑,jdk源码不懂。导致好多函数和自己想的不一致。还是自己手写靠谱:

import java.util.Scanner;

public class SpellSort {
    
    public static String reverse(int a ) {
        char[] aa = String.valueOf(a).toCharArray();
        char[] bb = new char[100];
        for(int i =0; i             bb[i] = aa[aa.length-1-i];
        }
        return String.valueOf(bb);
    }
 
    public static void main(String[] args) {
        int n, q;
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        q = sc.nextInt();
        int[] target = new int [100000];
        int[][] libraryCode = new int[100000][3];
        String[] result  = new String[100000];
        for(int i= 1;i <= n; i++)
        {
            target[i] = sc.nextInt();
            result[i] = reverse(target[i]);            
        }
        
        for(int j = 1; j <= q; j++ )
        {
            libraryCode[j][1] = sc.nextInt();
            libraryCode[j][2] = sc.nextInt();
            String temp = reverse(libraryCode[j][2]);
            String min="99999999999"; int mini = 0;
         
                for(int i= 1; i <= n; i++) {
                    if( startWithString(result[i], temp) && ifMin(min ,result[i]))
                    {
                        min = result[i];
                        mini = i;
                    }              
            }
            libraryCode[j][2] = mini;
        }
    for(int i = 1 ; i <= q; i++) {
        
         if(libraryCode[i][2] != 0)
        System.out.println(target[libraryCode[i][2]]);
         else 
             System.out.println(-1);
        
    }        
    }
    private static boolean startWithString(String string, String temp) {  //这个是判断是否开始 
        // TODO Auto-generated method stub
        string = string.trim();
        temp = temp.trim();
        if(temp.length() > string.length()) return false;
        int length = string.length()< temp.length()? string.length():temp.length();
        char[] aa = string.toCharArray();
        char[] bb = temp.toCharArray();
        for(int i=0;i         {
            if(aa[i] != bb[i])
                return false;
        }
        return true;
    }

    public static boolean ifMin(String a, String b) {   //这个判断是否找到更小的值
        a= a.trim();
        b= b.trim();
        char[] aa = a.toCharArray();
        char[] bb = b.toCharArray();    
        if(aa.length != bb.length) {
            return aa.length > bb.length ? true:false;
        }
        for(int i=0; i < aa.length; i++)
        {
            if(aa[i] != bb[i])
                return Integer.parseInt(String.valueOf(aa[i])) > Integer.parseInt(String.valueOf(bb[i])) ? true:false;
        }
        return false;
    }
}
 

程序很简单,说下思路

1. 比较后几位,可以直接把数字变为字符串 然后 翻转比较(这个思路是解决的关键,别的也可以做。暂时没想)

2.如果有多个符合条件 就比较谁最小 如我写的ifMin 判断是否有最小的

好了,我去写写搜索了。感觉这个没意思,推荐大家学学 alpha-beta剪枝。

你可能感兴趣的:(noip2017 普及组第二题 题解)