k转后查找阵列状态

时间:2014-05-04 08:23:08

标签: c arrays algorithm

  

代码主厨问题

     

给定 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;
}

1 个答案:

答案 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。这足以进行所有这些计算。