请问下关于程序提交超时的问题

zbz4785 2007-07-18 03:57:30
最近在做ACM的题目,结果对了,每次提交都说超时,我到网上,我是用结构体存储数据的,我看到一个用全局的数组来存数据,结果他的能过。

下面是我的代码:

#include "iostream"

using namespace std;

struct Inf
{
int LNum;
int ATime;
int Init[26];
int Dec[26];
int Dis[26];
};

struct Best
{
int EveTime[26];
int All;
};

int MaxNum(int Num[],int n)
{
int Max=0;
int i=0;
while (i<n)
{
if (Num[Max]<Num[i])
Max=i;
i++;
}
return Max;
}

int main(int argc, char *argv[])
{
Inf Dat;
Inf Tmp;
int i,j,k; //循环记录变量
int mark;
int tmp;
Best Res;
int LastTime; //除去走路,剩下的时间
Best MaxTmp;
cin>>tmp;
while (tmp!=0)
{
Dat.LNum=tmp;
cin>>Dat.ATime;
j=0;
while (j<Dat.LNum)
{
cin>>Dat.Init[j++];
}
j=0;
while (j<Dat.LNum)
{
cin>>Dat.Dec[j++];
}
j=0;
while (j<Dat.LNum-1)
{
cin>>Dat.Dis[j++];
}
// }
// mark=i;
//读数据成功,开始寻找最佳钓鱼最佳方案,贪心算法
//先找第一组的最佳方案
Res.All=-1;
for (i=1;i<=Dat.LNum;i++)
{
Tmp=Dat;
//在第一个至第i个湖钓鱼
LastTime=Tmp.ATime*12;
if (i>1)
{
j=i-1;
while (j)
{
LastTime-=Tmp.Dis[j-1];
j--;
}
}
// j=0; //记录当前湖里最大收获湖的号码
MaxTmp.All=0;
for (k=0;k<16;k++)
{
MaxTmp.EveTime[k]=0;
}
while (LastTime)
{
j=MaxNum(Tmp.Init,i);
if (Tmp.Init[j]>0)
{
MaxTmp.All+=Tmp.Init[j];
}
MaxTmp.EveTime[j]++;
Tmp.Init[j]-=Tmp.Dec[j];
if (Tmp.Init[j]<0)
{
Tmp.Init[j]=0;
}
LastTime--;
}
if (MaxTmp.All>Res.All)
{
Res=MaxTmp;
}
}
for (i=0;i<Dat.LNum-1;i++)
{
cout<<Res.EveTime[i]*5<<", ";
}
cout<<Res.EveTime[i]*5<<endl;
cout<<"Number of fish expected: "<<Res.All<<endl;
cout<<endl;
cin>>tmp;
}
return 0;
}

这个是网上的代码:

#define max 200

int h,n;
int fi[max],di[max],ti[max];
int res[max],fish,resMax[max],fishMax;

int init();
void done();
void getFish(int ,int);

int main(int argc, char *argv[])
{
int i;

while(init()){
done();

for(i=1; i<n; i++){
printf("%d, ",resMax[i]);
}
printf("%d",resMax[i]);
printf("\n");
printf("Number of fish expected: %d\n\n",fishMax);

}
return 0;
}

void getFish(int lack,int leftTime)
{
int i,j,pos;
int fi2[max];

fish=0;
for(i=1; i<=n; i++){
fi2[i]=fi[i];
res[i]=0;
}
while(leftTime>0){
pos=1;
for(i=1; i<=lack; i++){
if(fi2[pos]<fi2[i]) {
pos=i;
}
}
if(fi2[pos]==0)break;
fish+=fi2[pos];
res[pos]+=5;
leftTime-=5;
if(fi2[pos]>di[pos]) fi2[pos]-=di[pos];
else fi2[pos]=0;
}
res[1]+=leftTime;
}

void done()
{
int i,j;
int leftTime=h;
for(i=1; i<=n; i++){
if(leftTime<=ti[i-1]*5){
break;
}
leftTime-=ti[i-1]*5;
getFish(i,leftTime);
if(fish>fishMax) {
fishMax=fish;
for(j=1; j<=n; j++){
resMax[j]=res[j];
}
}else if(fish==fishMax){
for(j=1; j<=n; j++){
if(resMax[j]>res[j]) break;
if(resMax[j]<res[j]){
for(;j<=n;j++){
resMax[j]=res[j];
}
break;
}
}
}
}

}

int init()
{
int i;
scanf("%d",&n);
if(n==0) return 0;
scanf("%d",&h);

for(i=1; i<=n; i++){
scanf("%d",&fi[i]);
resMax[i]=0;
}
for(i=1; i<=n; i++){
scanf("%d",&di[i]);
}
for(i=1; i<=n-1; i++){
scanf("%d",&ti[i]);
}
fishMax=0;
h=h*60;
ti[0]=0;
return 1;
}

请高手指点下,超时的原因?
...全文
127 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbz4785 2007-07-18
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/5165805.html

做鸡真好吃 2007-07-18
  • 打赏
  • 举报
回复
请问ACM是什么呀!什么的缩写?说来听听!~
星羽 2007-07-18
  • 打赏
  • 举报
回复
up
FingerStyle 2007-07-18
  • 打赏
  • 举报
回复
ACM从来没做过...
jixingzhong 2007-07-18
  • 打赏
  • 举报
回复
那就用全局的,
用空间换时间 ...

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧