在uva 10954中获得WA [关闭]

Posted

技术标签:

【中文标题】在uva 10954中获得WA [关闭]【英文标题】:getting WA in uva 10954 [closed] 【发布时间】:2019-07-15 04:06:24 【问题描述】:

让我们为它添加一些独创性。加法运算现在需要成本,而成本是要相加的两者的总和。因此,要添加 1 和 10,您需要成本 11。如果要添加 1、2 和 3。有几种方法:1 + 2 = 3,成本 = 31 + 3 = 4,成本 = 42 + 3 = 5 , cost = 53 + 3 = 6, cost = 62 + 4 = 6, cost = 61 + 5 = 6, cost = 6Total = 9Total = 10Total = 11我希望你已经明白你的使命,添加一组整数,这样成本最低。输入每个测试用例都以一个正数开始,N(2N5000) 后跟 N 个正整数(都小于 100000)。输入由 N 的值为零的情况终止。不应处理这种情况。输出对于每种情况,在一行中打印添加的最低总成本。

示例输入

3   
1 2 3   
4  
1 2 3 4  
0  

样本输出

9  
19  

我尝试对给定数组进行排序,然后为 cumsum (CS) 取另一个数组,并将除 cs[0] 之外的所有 CS 元素求和。我正在为这种方法获取 WA,请解释一下

int n,i,hold=0;   

while(1)   

    cin>>n;

    if(n==0)break;

    int arr[n],cs[n];

    for(i=0;i<n;i++) cin>>arr[i];

    sort(arr,arr+i);

    cs[0]=arr[0];

    for(i=1;i<n;i++)cs[i]=arr[i]+cs[i-1]; 

    cs[0]=0;
    int sum=0;
    for(i=1;i<n;i++)sum+=cs[i]; 
    cout<<sum<<endl;
    sum=0;


输入:

9
66 85 52 22 44 1 59 88 67 
0

我的出局:

1822

预期结果(udebug):

1454

获取 WA

【问题讨论】:

int arr[n],cs[n]; -- 这不是有效的 C++。 您有一个失败的测试输入。这使您比大多数提出这些问题的人领先一步。您应该做的是启动开发环境附带的调试工具,输入您的输入案例,并逐步执行程序,直到您发现程序与您的期望有偏差。这通常是一个错误。 【参考方案1】:

你的想法是错误的解决这个问题。 在获取数据结构上的所有元素后,您应该重复这 3 点1) 排序。 2)对第一个两个值求和,并从数据结构中删除第一个两个值 3)将总和添加到成本和数据结构中。 您可以使用 priority_queue 作为数据结构。

【讨论】:

【参考方案2】:

使用最小堆并添加 2 个最小元素。示例:

1 2 3 -> 3 3 -> 6。 1 2 3 4 -> 3 3 4 -> 4 6 -> 10。

希望对你有帮助。

【讨论】:

以上是关于在uva 10954中获得WA [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

UVa10954 Add All (Huffman编码,优先队列)

UVa 10954 - Add All

UVA 10954 Add All

UVa 10954 Add All(优先队列)

uva-10954-贪心

UVA-10954 Add All