概述
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<aa.length; 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<length;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 普及组第二题 题解的全部内容,希望文章能够帮你解决noip2017 普及组第二题 题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复