POJ 2950 摘花生 解题报告
POJ 2950 摘花生 解题报告
编号:2950
考查点:模拟
思路:就是模拟,先找到最大的点,然后逐个加,判断时间是否到即可.
提交情况:这道题我是相当的冤,自己还算顺利的写出来后,提交结果一直是runtime error,我还以为是超时..后来怎么改都不行,请教zz后晓得原来是数组初始化问题,自己又重新定义数组,并且先排序,减少了查找的时间,一次就AC了..
Source Code:
//POJ Grids 2950
#include <math.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int ary[3000][3];
int m,n,t;
int Compare(const void* a,const void* b)
{
return *(int*)b - *(int*)a;
}
int main()
{
int count;
cin>>count;
while (count--)
{
memset(ary,0,3000*3*sizeof(int));
cin>>m>>n>>t;
int max = 0,r = -1,l = 0,s = 0;
int index = 0;
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
int temp;
cin>>temp;
if (temp)
{
ary[index][0] = temp;
ary[index][1] = i;
ary[index][2] = j;
index++;
}
}
}
qsort(ary[0],index,3*sizeof(int),Compare);
int a,b;
a = b = 0;
m = 0;
for (int i=0;i<index;i++)
{
a = ary[i][1];
b = ary[i][2];
if (r==-1)
{
if (2*abs(a-r)+1<=t)
{
s += abs(a-r)+1;
r = a;
l = b;
max += ary[i][0];
}
else
break;
}
else
{
if (s+1+abs(a-r)+abs(b-l)+a+1<=t)
{
s += abs(a-r)+abs(b-l)+1;
r = a;
l = b;
max += ary[i][0];
}
else
break;
}
}
cout<<max<<endl;
}
return 0;
}
总结:下次记住了runtime error一般是数组初始化问题,要熟练使用快排算法,自己这道题的代码应该是还算不错,估计性能比书上的还要好些.
By Ns517
Time 09.01.26