码迷,mamicode.com
首页 > 其他好文 > 详细

USACO Greedy Gift Givers 解题心得

时间:2015-10-07 22:53:51      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

本题算法不难想出,但是中间还是出现了一些问题。

开始的时候是#11:Execution error,后来把普通的数组改成动态数组后问题消失。

后来又出现了Execution error: Your program had this runtime error: Illegal file open (/dev/tty)。

随后google解决方案,多数都是数组开小了。遂开大数组,无效。

突然意识到很有可能是低级错误,于是检查代码。

发现写了个

for(int i = 0; i < n2 ; i++)
delete[] d;

一开始没有注意到是因为这些错误编译器(ClodeBlocks)都会无视而成功编译,本地可以成功运行.

删掉循环,上传,通过。

有时候错误可能并不是和预设地一样,但是通过逻辑检查应该还是可以检查出来。

自己本地写代码,应该尽可能严谨,而不是只求编译器通过。

最后的代码:

/*
ID: bluemit1
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main() {
ofstream fout ("gift1.out");
ifstream fin ("gift1.in");
int n;
fin >> n ;
char *a0 = new char[n*18];
char **a;
a = new char *[n];
for(int i=0;i<n;++i)
a[i] = a0 + i*18;
char c[18];int *b=new int [n];
for(int i=0;i<n;i++)
{
b[i]=0;
}
for(int i=0;i<n;i++)
for(int j=0;j<18;j++)
{
a[i][j]=‘\0‘;
}
for (int i=0;i<n;i++)
{
fin>>a[i];
}

for(int i=0;i<18;i++)
{
c[i]=‘\0‘;
}
fin>>c;
while(c[0]!=‘\0‘)
{
int sum,n2;
fin>>sum>>n2;
        if(n2!=0)
{
char *d0 = new char[n2*18];
char **d;
d = new char *[n2];
for(int i=0;i<n2;++i)
d[i] = d0 + i*18;
for(int i=0;i<n2;i++)
for(int j=0;j<18;j++)
{
d[i][j]=‘\0‘;
}
for(int i=0;i<n2;i++)
{
fin>>d[i];
}
for(int i=0;i<n2;i++)
{
for(int j=0;j<n;j++)
{
                if(strcmp(a[j],d[i])==0)
{
                        b[j]+=(sum/n2);

}
                }
}
            for(int j=0;j<n;j++)
{
if(strcmp(a[j],c)==0)
{
b[j]-=sum;
b[j]+=sum%n2;
}
}
            delete[] d;
delete [] d0;
        }
for(int i=0;i<18;i++)
{
c[i]=‘\0‘;
}
fin>>c;
    }

for(int i=0;i<n;i++)
{
fout<<a[i]<<" "<<b[i]<<endl;
}

delete[] a;
delete b;
return 0;
}

USACO Greedy Gift Givers 解题心得

标签:

原文地址:http://www.cnblogs.com/bluemit/p/4859674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!