标签:
本题算法不难想出,但是中间还是出现了一些问题。
开始的时候是#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;
}
标签:
原文地址:http://www.cnblogs.com/bluemit/p/4859674.html