问题陈述:
有N个柜台,每个柜台都有指定数量的鸡块 在任何柜台购买的每个金块的成本与在该时间点仍然留在柜台的金块数相同(包括购买的金块)。
Pre希望拥有M最昂贵的掘金。购买M最昂贵的掘金所需的总金额是多少。
有关更详细的问题陈述,请参阅here。
这是我的JAVA代码:
import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
int t,n,i,max;
long ans,m,k;
BufferedReader br= new BufferedReader( new InputStreamReader(System.in));
t = Integer.parseInt(br.readLine());;
while(t!=0)
{
ans = 0;
n = Integer.parseInt(br.readLine());;
int a[] = new int[n];
int b[] = new int[100005];
int c[] = new int[100005];
StringTokenizer tk = new StringTokenizer(br.readLine());
i = 0;
while(tk.hasMoreTokens()){
a[i] =Integer.parseInt(tk.nextToken());
i++;
}
m = Long.parseLong(br.readLine());
max = a[0];
for(i=0;i<n;i++){
if(a[i]>max){
max = a[i];
}
}
for(i=0;i<n;i++){
b[a[i]]++;
}
c[max] = b[max];
for(i=max-1;i>=1;i--){
if(b[i]!=0){
c[i] = c[i+1] + b[i];
}
else{
c[i] = c[i+1];
}
}
k = 0;
for(i=max;i>=1;i--){
if(c[i]>=m-k){
ans = ans + (m-k)*i;
break;
}
else{
ans = ans + c[i]*i;
k = k + c[i];
}
}
System.out.println(ans);
t--;
}
}
}
它为简单的测试用例提供了正确的答案,但在SPOJ上给出了错误的答案。我的逻辑是否存在问题,或者JAVA本身是否在SPOJ上产生了错误的答案?如果JAVA出现问题,那么我是否应该在JAVA中退出编码以解决竞争性编码问题?
修改:已移除Arrays.sort()
。替换为Counting Sort。更新了代码。仍然 WA
Edit2:将所有数组转换为long
类型。通过所有测试。无法弄清楚原因。任何人都可以告诉为什么?
答案 0 :(得分:0)
SPOJ上的java没有问题,不,你不应该在JAVA中退出编码。大多数竞争对手在c ++中竞争,但几乎所有站点都支持java作为编程语言,很多人都使用它。我个人使用java来解决一些在c ++中难以实现的问题。
现在关于第二个问题 - 你的实现存在多个问题,而且我认为在最坏的情况下你的代码会太慢(尝试确定哪个是最差的)。