代码主厨问题
给定 N 整数 A 和数字 K 的数组。在转弯期间,选择所有Ai的最大值,让我们称之为 MAX 。然后 Ai = 对于每 1 <= i <= N ,完成MAX-Ai 。找出K转后阵列的样子。
输入
数字 N 和 K 在输入的第一行中给出。然后在第二行给出 N 整数,表示数组 A 。
输出
在一行上输出 N 数字。在 K 之后,它应该是 A 数组。
约束
1 <= N <= 10^5 0 <= K <= 10^9
Ai 的绝对值不超过2 * 10 ^ 9。
实施例
输入:
4 1 5 -1 7 0
输出:
2 8 0 7
这是我的代码。它在我的本地计算机(Dec C ++ 5.5.1 OS Win8)中运行得非常好。我过去2天一直在考虑这个问题,但是当我将它上传到代码大师时,它会显示错误答案。请告诉我这段代码中缺少什么?
#include <stdio.h>
long long int find_largest(long long int A[], long size){
long int largest =A[0],i;
for(i=1;i<size;i++){
if(largest < A[i])
largest = A[i];
}
return largest;
}
int main(){
long long int A[100000],K,j,largest =0, temp,prev_largest = 0;
long N, i;
char eof_chk;
int flag = 0;
while(1){
scanf("%ld %lld",&N,&K);
for(i=0;i<N;i++)
scanf("%lld",&A[i]);
largest = find_largest(A,N);
// Processing...
for(j=1; j<=K; j++){
largest = find_largest(A,N);
if(prev_largest == largest){
if((K-j)%2 == 0){
for ( i = 0; i < N; i++ ){
temp = largest - A[i];
if(temp > 2000000000)
A[i] = -(2000000000 - temp + 2000000000 + 1);
else
A[i] = temp;
}
break;
}
else break;
}
else{
for ( i = 0; i < N; i++ ){
temp = largest - A[i];
if(temp > 2000000000)
A[i] = -(2000000000 - temp + 2000000000 + 1);
else
A[i] = temp;
}
prev_largest = largest;
}
}
// Start for formated printing
for(i=0;i<N;i++){
if(i == (N-1)){
printf("%lld",A[i]);
}
else
printf("%lld ",A[i]);
}
// End for formated printing
if(getchar() == EOF) {
break;
}
else
printf("\n");
}
return 0;
}
答案 0 :(得分:1)
问题描述
仅声明初始数组值在范围内
-2*10^9 .. 2*10^9
,但不是在每次迭代步骤后都应该将值限制在此范围内。所以你的主要处理循环&#34;应该看起来像这样:
for(j=1; j<=K; j++){
largest = find_largest(A,N);
for ( i = 0; i < N; i++ ) {
A[i] = largest - A[i];
}
}
然后
-2*10^9 .. 2*10^9
。0 .. 4*10^9
。0 .. 4*10^9
范围内。 long long int
是编译器上的64位数量,可以保存最多值
9223372036854775807
。这足以进行所有这些计算。