天坑!!!
https://ac.nowcoder.com/acm/contest/105825/D
哪位大佬帮忙看一下
不知道是不是读取数据的问题。
快读不能ac,scanner却可以ac。这你受得了吗
不知道是不是long类型数据精度丢失导致的。快读有一个用例未通过。scanner确可以通过。核心代码都一样。 题目数据最大1e18,使用快读试了一下,精度并未丢失。
可以看出读取long数据并未丢失精度,但是不能ac。不知道是不是代码的问题。
快读代码:通过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]--;
}
}