C++程序设计实践——杭电acm2013、2014、2015、2016

    技术2026-01-30  6

    杭电acm练习题

    Day02—— ProblemID=2013

    代码如下:

    #include<iostream> using namespace std; int main() { int n; while (cin >> n) { int num = 1; for (int i = n; i > 1;i--) { num = (num + 1) * 2; } cout << num << endl; } return 0; }

    运行结果: 我跟傻了似得,一开始假设一个总量x正面推,算起来太麻烦了,后来想到:假设总量是x,吃了2天,第一天吃了(1/2)*x+1个桃子,那第二天吃的1就是(1/2)*x-1,所以只要以最后一天的一个桃子+1再乘2,就能得到这一天和上一天吃的桃子的总数,继续往上能得到这三天的桃子总量。因为后面的加起来一定等于总量x的(1/2)*x-1。

    Day02—— ProblemID=2014

    代码如下:

    #include <iostream> #include <iomanip> using namespace std; int main() { float n,sum, max, min,total; float point[100]; while (cin >> n) { sum = 0;max = 0;min = 999; point[0] = { 0 }; for (int i = 1; i <= n; i++) { cin >> point[i]; if (point[i] > max) max = point[i]; if (point[i] < min) min = point[i]; sum = sum + point[i]; } total = (sum - max - min) / (n - 2); cout << setiosflags(ios::fixed) << setprecision(2) << total << endl; } }

    运行结果: 这个我也和傻了似得,一开始写好代码运行没错但就是不输出,后来一看,我没写输出函数,而且一开始我是打算直接循环赋值不设置数组,后来因为没输出就去看了下别人的代码,后来把我原来写的不用数组的代码改了一下也可以accepted。 参考的代码地址:杭电ACM 2014:青年歌手大奖赛_评委会打分可以去看下这个他的代码有解释,挺好理解的。 不用数组的代码如下:

    #include <iostream> #include <iomanip> using namespace std; int main() { float n, x, sum, max, min; while (cin >> n) { sum = 0; max = 0; min = 999; for (int i = 1; i <= n; i++) { cin >> x; if (x > max) max = x; if (x < min) min = x; sum = sum + x; } sum = (sum - max - min) / (n-2); cout << setiosflags(ios::fixed) << setprecision(2) << sum << endl; } }

    Day02—— ProblemID=2015

    代码如下:

    #include <iostream> using namespace std; int main() { int n,m,sum; int a[100]; for (int i = 0; i < 100; i++) { a[i] = 2 * i + 2; } while (cin >> n >> m) { int key = 0; bool flag = false; sum = 0; for (int i = 0; i < n; i++) { sum = sum + a[i]; key++; if (key == m) { if (flag == false) { cout << sum / m; flag = true; } else cout << " " << sum / m; sum = 0; key = 0; } } if (n % m == 0) cout << endl; else cout << " " << sum / key << endl; } return 0; }

    运行结果: 这道题挺简单的,只是写代码的我脑子又抽了而已,本地运行到最后一行的:cout << " " << sum/key << endl;一直报错我一开始没找到原因,以为是sum/key的结果出了问题,后来我让最后一行输出sum和key的值,一检查才发现是上面的if判断条件n%m==0我写错了,我把n和m的位置写反了,所以在sum=0和key=0时还是去不符合if的判断条件,输出sum/key,因为分母此时为0,所以就报错了。改过来以后就一次性提交成功。

    Day02—— ProblemID=2016

    代码如下:

    #include <iostream> using namespace std; int main() { int n,first,min,key; int a[100] = { 0 }; while (cin >> n) { min = 999; key = 0; for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] < min) { min = a[i]; key = i; } } first = a[0]; a[0] = min; a[key] = first; for (int i = 0; i < n; i++) { if (i == 0) cout << a[i]; else cout << " " << a[i]; if (i == n-1) cout << endl; } } return 0; }

    第一次accepted的代码忘了考虑n=0时结束程序,第二次加上了对n是否等于0的判断,代码如下:

    #include <iostream> using namespace std; int main() { int n,first,min,key; int a[100] = { 0 }; while (cin >> n) { if (n == 0) break; min = 999; key = 0; for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] < min) { min = a[i]; key = i; } } first = a[0]; a[0] = min; a[key] = first; for (int i = 0; i < n; i++) { if (i == 0) cout << a[i]; else cout << " " << a[i]; if (i == n-1) cout << endl; } } return 0; }

    运行结果:

    最后的吐槽

    我以为这次四个Accepted又要像2012那一次一样半天搞不出来,没想到基本都是一次性提交成功,开心啊,写实验报告二去了。

    Processed: 0.026, SQL: 9