http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1168
题意比较简单,就是用一些给定的逻辑计算结果。由于有很多重复计算所以需要建个表,把数据存起来。
这道题目最主要的问题是输入输出对速度的影响,因为测试数据数量相当惊人,如果用比较费时的cin cout,那么必然超时,所以必须使用比较快速的输入输出,比如scanf,printf,然后就过了。通过这道题目,我知道了这两种输入法居然有这么大的差距,以后确实需要注意。
代码很简单:
/* This problem tell us a concept that: cin and cout is much slower than scanf and prinf */ #include <iostream> #include<stdio.h> using namespace std; long matrix[21][21][21]; void init() { for(int i=0;i<=20;i++) for(int j=0;j<=20;j++) { matrix[0][i][j] = matrix[i][0][j] = matrix[i][j][0] = 1; } for(int i=1;i<=20;i++) for(int j=1;j<=20;j++) for(int k=1;k<=20;k++) { if(i<j && j<k) matrix[i][j][k] = matrix[i][j][k-1]+matrix[i][j-1][k-1]-matrix[i][j-1][k]; else matrix[i][j][k] = matrix[i-1][j][k]+matrix[i-1][j-1][k]+matrix[i-1][j][k-1]-matrix[i-1][j-1][k-1]; } } int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout); #endif init(); int a,b,c; while(scanf("%d %d %d", &a, &b,&c)!=EOF) { //I add a break here to see whether TLE if(a==-1&&b==-1&&c==-1) break; if(a<=0||b<=0||c<=0) { printf("w(%d, %d, %d) = 1/n", a, b, c); }else if(a >20 || b>20 || c>20) { printf("w(%d, %d, %d) = %ld/n", a, b, c,matrix[20][20][20]); }else { printf("w(%d, %d, %d) = %ld/n", a, b, c,matrix[a][b][c]); } } return 0; }