本题算法不难想出,但是中间还是出现了一些问题。
开始的时候是#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: bluemit1PROG: gift1LANG: 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;}
时间: 2024-08-26 13:04:55