天坑!!!

https://ac.nowcoder.com/acm/contest/105825/D

哪位大佬帮忙看一下

不知道是不是读取数据的问题。

快读不能ac,scanner却可以ac。这你受得了吗

不知道是不是long类型数据精度丢失导致的。快读有一个用例未通过。scanner确可以通过。核心代码都一样。 题目数据最大1e18,使用快读试了一下,精度并未丢失。

可以看出读取long数据并未丢失精度,但是不能ac。不知道是不是代码的问题。 alt

快读代码:通过92.31%

import java.io.*;
import java.util.Arrays;
public class Main{
    static int N = 100010;
    static long[] a = new long[N];
    static long[] b = new long[N];//差分数组
    static int n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer in = new StreamTokenizer(br);
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        in.nextToken();
        boolean flag = true;//判断全部的元素是不是相同
        n = (int) in.nval;
        for (int i = 1; i <= n; i++) {
            in.nextToken();
            a[i] = (long) in.nval;
            if (i >= 2 && a[i] != a[i - 1]) {
                flag = false;
            }
        }
        if (flag) {
            out.print(0);
        } else {
            Arrays.sort(a,1,n + 1);
            for (int i = 1; i <= n; i++) {//差分数组构建
                b[i - 1] = a[i] - a[i - 1];
            }
            long ans = 0;
            //判断第一个元素是不是0
            if (a[1] != 0) {
                out.print(-1);
            } else {
                for (int i = 0; i < n; i++) {
                    if (b[i] == 0) {
                        continue;
                    }
                    if (b[i] == 1) {
                        ans++;
                        go(i);
                        continue;
                    }
                    //b[i]不等于1,0的情况
                    ans += (b[i] - 1);
                    b[i] = 1;
                    i--;
                }
                out.print(ans);
            }

        }
        out.flush();
        out.close();
        br.close();

    }

    static void go(int i) {
        //将i位置后面的1全部变成0,第一个非1减1
        while (i <= n && b[i] <= 1) {
            b[i] = 0;
            i++;
        }
        if (i == n) return;
        b[i]--;
    }
}


scanner读取:通过100%

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    static int N = 100010;
    static long[] a = new long[N];
    static long[] b = new long[N];//差分数组
    static int n;

    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        boolean flag = true;//判断全部的元素是不是相同
        n = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = scanner.nextLong();
            if (i >= 2 && a[i] != a[i - 1]) {
                flag = false;
            }
        }
        if (flag) {
            System.out.print(0);
        } else {
            Arrays.sort(a,1,n + 1);
            for (int i = 1; i <= n; i++) {//差分数组构建
                b[i - 1] = a[i] - a[i - 1];
            }
            long ans = 0;
            //判断第一个元素是不是0
            if (a[1] != 0) {
                System.out.print(-1);
            } else {
                for (int i = 0; i < n; i++) {
                    if (b[i] == 0) {
                        continue;
                    }
                    if (b[i] == 1) {
                        ans++;
                        go(i);
                        continue;
                    }
                    //b[i]不等于1,0的情况
                    ans += (b[i] - 1);
                    b[i] = 1;
                    i--;
                }
                System.out.print(ans);
            }

        }
    }

    static void go(int i) {
        //将i位置后面的1全部变成0,第一个非1减1
        while (i < n && b[i] <= 1) {
            b[i] = 0;
            i++;
        }
        if (i == n) return;
        b[i]--;
    }
}
全部评论
找到什么原因了
点赞 回复 分享
发布于 04-01 21:30 河南
 public class Main { static int N = 100010; static long[] a = new long[N]; static long[] b = new long[N];// 差分数组 static int n; public static void main(String[] args) throws IOException { boolean flag = true;// 判断全部的元素是不是相同 n = nextint(); for (int i = 1; i <= n; i++) { a[i] = nextlong(); if (i >= 2 && a[i] != a[i - 1]) { flag = false; } } if (flag) { println(0); } else { Arrays.sort(a, 1, n + 1); for (int i = 1; i <= n; i++) {// 差分数组构建 b[i - 1] = a[i] - a[i - 1]; } long ans = 0; // 判断第一个元素是不是0 if (a[1] != 0) { println(-1); } else { for (int i = 0; i < n; i++) { if (b[i] == 0) { continue; } if (b[i] == 1) { ans++; go(i); continue; } // b[i]不等于1,0的情况 ans += (b[i] - 1); b[i] = 1; i--; } println(ans); } }  flush(); }
点赞 回复 分享
发布于 03-31 15:45 黑龙江

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务