首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

那位 ACM 高手快来看看哦?该怎么解决

2012-04-05 
那位 ACM 高手快来看看哦??我做了一到ACM题目提码是2487在PKU中我写的程序是:::~~~~~~~~~~~~~~~~~~~~~~~~~

那位 ACM 高手快来看看哦??
我做了一到ACM题目       提码是     2487     在PKU     中
      我写的程序是       :::
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        题目的意思是:
                第一行输入一个     int   n   ;
                第2行输入一个大数b   和一个小数   c;
              上面的c代表一个数组的数的个数,后第3行就输入数组
                                              :
                                              :
                                  依次这样下去     要求的是数组中最少的几个数相加可以大于或等于b       然后输出   最少的个数。
        比如输入::
3
100   6                                                      
13   17   42   9   23   57                             这里     57+42+23> =100       所以得到     3  
99   6
13   17   42   9   23   57                                             57+42> =99   所以得到的是     2
1000   3
314   159   265                                         因为所有的加起来都不大于1000所以输出
                                                                                                                      impossible
       

后的到的结果是:::
  Scenario   #1:
3

Scenario   #2:
2

Scenario   #3:
impossible

                          如果看不动的大哥可以到     ::http://acm.pku.edu.cn/JudgeOnline/problem?id=2487
          去看一下题目哦!!!
          谢谢帮帮忙?
               
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include   <iostream>
using   namespace   std;
int   main()
{  
      int   b,a,e,sum,c,f,g;
      cin   > >   a;          
      int   *pp   =   new   int   [a];
      for(e     =   1;e   <=   a;e++)
      {
      cin   > >   b   > >   c;      
      int   *p   =   new   int[c];


    for(   int   d   =   0;d   <   c;d++)
    cin   > >   p[d];
 
    for(int   s   =   0;s   <   c;s++)
{         f   =   s;
for(int   j   =   s   +   1;j   <=   c;j++)
if(p[f]   <   p[j])f   =   j;
                if(s!=f)
      {
      g   =   p[s];
      p[s]   =   p[f];
      p[f]   =   g;
      }

}

  sum=0;
    for(int   h   =   0;h   <   c;     )                  
{
    sum   +=   p[h];
    if(sum   > =   b)
    {
  pp[e]=h+1;    
  break;
            }
              h++;  
  if(sum   <   b   )
  {
  pp[e]=0;

  }
    }
    }
 
    for(int   i=1;i <=a;i++)                                      
{
if(pp[i]   !=   0)
{
    cout   < <   "Scenario   # "   < <   i   < <   ": "   < <   endl;  
                    cout   < <   pp[i]   < <   endl;
      cout   < <   endl;
}
else
{
                cout   < <   "Scenario   # " < <   i   < <   ": "   < <   endl;
                cout   < <   "impossible "   < <   endl;
cout   < <   endl;
}

}


    system( "pause ");
return   0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        交了后他说我     Runtime   Error   我应该怎么搞才可以把它写好
    改了好就也没有该出来,
        那位大哥快帮帮忙哦?????

[解决办法]
int *pp = new int [a];
for(e = 1;e <= a;e++)
{
cin > > b > > c;
int *p = new int[c];
for( int d = 0;d < c;d++)
cin > > p[d];
==>
int pp[a];
for(e = 1;e <= a;e++)
{
cin > > b > > c;
int p[c];
for( int d = 0;d < c;d++)
cin > > p[d];
...

看这样是否能快那么一点 ...
[解决办法]
Runtime Error
是你程序运行错误了,检查一下吧.在某些情况下会出错
[解决办法]
个人觉得还不如先排序一下,然后从大到小加一次
[解决办法]
排序。。



然后类试背包问题。,。
[解决办法]
你的程序测试不够全面,很有可能一些临界值,或一些特殊值就不对了,你看看是不是.
[解决办法]
是时间的问题,哈哈哈。因为我也碰到过。可能题目要你只用O(n)的时间。
[解决办法]
/* 给你段C的标程。排序就好了 */

#include <stdio.h>
#include <stdlib.h>

int invcmp(const void *a, const void *b)
{
if (*(int *)a > *(int *)b)
return -1;
else if (*(int *)a < *(int *)b)
return 1;
else
return 0;
}

int main()
{
int i, j;
int n, max, k, sum;
int arr[1000];
scanf( "%d ", &n);
for (i = 1; i <= n; ++i) {
scanf( "%d %d ", &max, &k);
for (j = 0; j < k; ++j) {
scanf( "%d ", &arr[j]);
}
qsort(arr, k, sizeof(arr[0]), invcmp);
sum = 0;
for (j = 0; j < k; ++j) {
sum += arr[j];
if (sum > = max)
break;
}
printf( "Scenario #%d:\n ", i);
if (j == k)
puts( "impossible ");
else
printf( "%d\n ", j + 1);
putchar( '\n ');
}
return 0;
}

[解决办法]
there is one output for each input!
it 's no use for saving all cases ' results.
you can just simply output each case 's result
following that case.
[解决办法]
关于速度:

这个问题排序了就是至多O(n log n)速度,但你不用库函数给的排序(C++用sort),非得自己写一个更低效的,只能更慢。当然,这里即使自己写一个O(n^2)的排序也能通过。

而且你也不用把所有的数据都算出来以后才输出,算一个case就输出一个case(如kgn28所说),这样更省内存,也快些。当然,这里即使把所有的cases都算出来最后输出,也能通过。

第三,速度上C++的cin、cout比C的printf、scanf还是慢一些。当然,用cout、cin也能通过。

第四,如虫子所说,用定长的数组比用new分配一个数组要快。你的错误还在于只用new分配而不delete,数据多了内存就吃不消了。

==============================================================================

但是,真正的问题是:你的程序结果就是错的。

为什么是RE的结果(注意Runtime Error是运行错误,不是超时)我不确定:或许是你最后那用多余的system( "pause ")造成的,因为这个仅仅是用于调试的语句;也或许是因为你不delete动态数组造成的内存泄漏过于严重。

你程序主要的问题是,算法写错了(看得出来你想的没什么错)。真不知道你有没有把你的代码拿题目中已经给出的三组cases测试过,你的程序输出全部都是1!当然错了。

事实上,你的排序写错了。怎么错了,你自己检查,这是基本算法。你可以改正你自己的排序,应该最好是用C++的sort()函数。

更正的代码附后。

============================================================================

#include <iostream>
#include <algorithm>

using namespace std;

// compare function for sort algorithm
bool invcmp(const int &a, const int &b)
{
return a > b;
}

int main()
{
int b, a, e, sum, c, f, g;

cin > > a;
int *pp = new int[a];

for (e = 1; e <= a; e++) {

cin > > b > > c;
int *p = new int[c];
for (int d = 0; d < c; d++)
cin > > p[d];

/* INPUT DEBUG
cout < < endl < < "INPUT debug: " < < endl;
for (int i = 0; i < c; ++i)
cout < < i < < ': ' < < p[i] < < endl;
*/

/* your OLD WRONG sort
for (int s = 0; s < c; s++) {
f = s;
for (int j = s + 1; j <= c; j++)


if (p[f] < p[j])
f = j;
if (s != f) {
g = p[s];
p[s] = p[f];
p[f] = g;
}
}
*/
sort(p, p + c, invcmp);

/* OUTPUT DEBUG
cout < < endl < < "OUTPUT debug: " < < endl;
for (int i = 0; i < c; ++i)
cout < < i < < ': ' < < p[i] < < endl;
*/

sum = 0;
for (int h = 0; h < c;) {
sum += p[h];
if (sum > = b) {
pp[e] = h + 1;
break;
}
h++;
if (sum < b) {
pp[e] = 0;
}
}

delete[] p; // WARNING!
}

for (int i = 1; i <= a; i++) {
if (pp[i] != 0) {
cout < < "Scenario # " < < i < < ": " < < endl;
cout < < pp[i] < < endl;
cout < < endl;
} else {
cout < < "Scenario # " < < i < < ": " < < endl;
cout < < "impossible " < < endl;
cout < < endl;
}
}

delete[] pp; // it 's not necessary, but a good habbit

return 0;
}

[解决办法]
哦!用VC调试的时候才发现你RE的问题了,你的pp数组越界了!

你的下标竟然是从1开始的,不知道是从哪儿学的。这样一来上面的程序整个就要再改了,你自己弄吧。真是的……

热点排行