为什么我得到两个输出代替一个输出?

时间:2016-03-28 15:38:26

标签: c++ algorithm

我正在编写一个简单的程序,我使用单个cout语句获得相同数据的2个输出。我觉得我的循环出了问题,但我无法找到问题所在。如果可能的话,请告诉我需要改变什么;否则,我至少想知道为什么我的逻辑是错误的。

我的代码:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n ;
    cin >> n;
    vector<int> arr(n);
    vector<int> a(n);
    for(int arr_i = 0;arr_i < n;arr_i++){
       cin >> arr[arr_i];
       a[arr_i]=1;
    }
    int i,least,flag,count=n;
    do{
        cout<<count<<endl;
        count=0;
        flag=1;

        for(i=0;i<n;i++){   //for getting least number
            if(a[i]){
                if(flag){
                    least=arr[i];
                    flag=0;    
                }
                if(arr[i]<least){
                    least=arr[i];
                }
            }
        }

        for(i=0;i<n;i++){       // for actual logic
            if(arr[i]<=0||!a[i]){
                a[i]=0;

                //continue;
            }
            else{    
            arr[i]-=least;
            count++;
            }
        }

    }while(count);
    return 0;
}

示例输入:

6
5 4 4 2 2 8

预期输出

6
4
2
1

实际输出:

6
6
4
4
2
2
1
1

问题陈述

你被给予N个棍棒,每个棍子的长度是一个正整数。在棒上进行切割操作,使得它们全部减小最小棒的长度。

假设我们有六支以下长度:

5 4 4 2 2 8

然后,在一次切割操作中,我们从六根棍子中的每一根切割出长度为2的切口。对于下一次切割操作,留下四根棒(非零长度),其长度如下:

3 2 2 6

重复上述步骤直到没有留下棍棒。

考虑到N条的长度,打印每次后续切割操作之前剩余的木棒数量。

注意:对于每次切割操作,您必须重新计算最小的棒的长度(不包括零长度棒)。

1 个答案:

答案 0 :(得分:0)

一个注意到的错误:从leastarr[i]中减去arr[i]成为&lt; = 0 a[i]时仍然保持非零,并且在下一次迭代中,您得到的数量最少与之前的迭代相同。

其他问题:您的count是前一回合的count。在第一次迭代时,它等于6,因为条件if(arr[i]<=0||!a[i])不满足输入中的任何数字。

修好这部分后:

// for actual logic
if (a[i]) {
    arr[i] -= least;

    if (arr[i] <= 0)
        a[i] = 0;
    else
        count++;
}

看起来效果很好。