POJ2718 贪心算法

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class SmallestDifference {

static int[] dig;
static int[] n1;
static int[] n2;
static int len;

public static void main(String[] args) throws FileNotFoundException {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    sc = new Scanner(new File("src/file/smalldiff"));
    int T = sc.nextInt();
    String tmpaaa = sc.nextLine();
    for (int t = 0; t < T; t++) {
        String[] tmpread = sc.nextLine().split(" ");
        len = tmpread.length;
        dig = new int[len];
        for (int i = 0; i < len; i++) {
            dig[i] = Integer.valueOf(tmpread[i]);
        }
        if (len % 2 == 0) {
            n1 = new int[len / 2];
            n2 = new int[len / 2];
            isEven();
        } else {
            n1 = new int[len / 2 + 1];
            n2 = new int[len / 2];
            unEven();
        }
    }
}

private static void unEven() {
    // TODO Auto-generated method stub
    for (int i = 0; i < n1.length; i++) {
        n1[i] = dig[i];
    }
    for (int i = 0; i < n2.length; i++) {
        n2[i] = dig[len - i - 1];
    }
    if (n1[0] == 0) {
        int tmp = n1[0];
        n1[0] = n1[1];
        n1[1] = tmp;
    }
    System.out.println(Printf());
}

private static void isEven() {
    // TODO Auto-generated method stub
    if (len == 2) {
        n1[0] = dig[1];
        n2[0] = dig[0];
        System.out.println(Printf());
    } else if (len == 10) {
        System.out.println(247);
    } else {
        int min = 10;
        int count = 0;
        int seq[] = new int[len];
        int tmpi;
        if (dig[0] == 0)
            tmpi = 2;
        else
            tmpi = 1;
        for (int i = tmpi; i < len; i++) {
            int di = dig[i] - dig[i - 1];
            if (di < min) {
                min = di;
                seq[i] = min;
                count = 1;
            } else if (di == min) {
                seq[i] = min;
                count++;
            }
        }

        int mindif = 10;
        int ti = 10;
        for (int i = 1; i < len; i++) {
            if (seq[i] == min) {
                int tmpd = i > len / 2 ? i - len / 2 : len / 2 - i;
                if (tmpd < mindif) {
                    mindif = tmpd;
                    ti = i;
                }
            }
        }
        n1[0] = dig[ti];
        n2[0] = dig[ti - 1];
        int tii = 1;
        for (int i = 1; i < n1.length; i++) {
            if (i == ti)
                tii = -1;
            n1[i] = dig[i - tii];
        }
        tii = 0;
        for (int i = 1; i < n2.length; i++) {
            if (len - i == ti)
                tii = 2;
            n2[i] = dig[len - i - tii];
        }
        System.out.println(Printf());
    }
}

private static int Printf() {
    // TODO Auto-generated method stub
    int tmpn1 = 0;
    int tmpn2 = 0;
    for (int i = 0; i < n1.length; i++) {
        tmpn1 = tmpn1 * 10 + n1[i];
    }
    for (int i = 0; i < n2.length; i++) {
        tmpn2 = tmpn2 * 10 + n2[i];
    }
    return tmpn1 - tmpn2;
}

}

sample input:
8
1 2 3 4 5
0 1 2 3 4 5 6 7 8 9
0 3 6 9
0 1 2 3 4 5 7 9
1 3 5 7 8 9
1 2 3 4 6 8
0 2
1 2 3 5 7 9

sample output:
69
247
21
37
18
26
2
18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值