没想到这道题自己贡献了4次TLE和1次的CE。
分析了下原因,自己本想先用函数计算出总时间,但这会导致很多次的重复计算,效率超低。
低效率代码:
#include <stdio.h> #define MAX_T 100002 char cvec[MAX_T]; int m, t, u, f, d; int get_total_time(int n_units) { int total_time = 0; for(int i = 0; i < n_units; i++) { switch(cvec[i]) { case 'u': case 'd': total_time += (u + d); break; case 'f': total_time += 2 * f; break; default: break; } } return total_time; } int main() { scanf("%d%d%d%d%d", &m, &t, &u, &f, &d); char c_temp; for(int i = 0; i < t; i++) { scanf("/n%c", &c_temp); cvec[i] = c_temp; } int n_units = 1; int total_time; while(1) { total_time = get_total_time(n_units); if(total_time < m) { n_units++; } else if(total_time == m) { break; } else { n_units--; break; } } printf("%d/n", n_units); return 0; }
修改后AC的代码:
#include <stdio.h> #define MAX_T 100002 int main() { char cvec[MAX_T]; int m, t, u, f, d; scanf("%d%d%d%d%d", &m, &t, &u, &f, &d); for(int i = 0; i < t; i++) scanf("/n%c", &cvec[i]); //用scanf的%c输入char时,记得去除前面的/n和空格 int total_time = 0; int n_units = 0; for(; total_time < m; n_units++) { if(cvec[n_units] == 'u' || cvec[n_units] == 'd') { total_time += (u + d); } else { total_time += (f + f); } } if(total_time > m) n_units--; printf("%d/n", n_units); return 0; }
优化ACM编程题解法
本文分享了一道ACM编程题的解答过程,通过对比低效与高效代码,总结出减少重复计算的重要性。介绍了如何避免不必要的计算以提高程序运行效率。
506

被折叠的 条评论
为什么被折叠?



