CodeForces

来源:互联网 发布:手机淘宝怎么退出 编辑:程序博客网 时间:2024/06/05 02:36
/*保留最初版本的错误代码,以免重蹈覆辙:#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;int a[N];int main(){int n, k;while (cin >> n >> k){for (int i = 1; i <= n; i++)cin >> a[i];int sum = 0;int day = n - k + 1;for (int i = 1; i <= day; i++)for (int j = 0; j < k; j++)sum += a[i + j];double ans = sum * 1.0 / day;cout << fixed << setprecision(10) << ans << endl;}return 0;}本来以为这题好像还算简单,思路很快就想到,代码也并不难,结果被卡得十分心碎,记录下历程;1.  被卡了一次WA,是由于超出int型的范围导致的,Test 17,数据如下:  10000 1067658 54568 70352 40491 94066 73015 36812 82493 11896 74941 15492 26528 91141 85988 22892 85879 38839 60777 82057 87516 48349 43069 81527 39928 25564 79496 25988 93740 44973 70433 45394 52972 65916 81495 1304 43647 85099 12075 49154 76032 23085 45907 16237 52096 94731 18393 77260 6145 50370 87962 71622 96668 39587 25992 20757 53884 72434 12329 584 38561 80968 7733 98402 26527 76465 55323 27544 67068 45007 81053 25687 78837 72565 3343 58141 71609 14444 50812 28123 55500 58097 56033 75257 43462 263...是因为sum设置为了浮点型,应该改为long long 或者double型2.被卡了一次TLE,数据没什么线索,看了也不知道为什么卡TLE,就不贴上来了一开始一直特别奇怪,第一反应:是不是要取消cin和stdio的同步,来提高C++中I/O的效率,就如同入门经典里说的那样,仍然TLE再想,是不是万能的头文件<bits/stdc++.h>有些潜在的副作用?改为<iostream> + <iomanip>,仍然TLE就在我一筹莫展、苦思不得的时候,突然想到去看下shared出来的代码于是仔细观察了下AC了的同学的代码,发现,之前预习的数据结构有点作用噢!我好像发现了可能的问题所在...我写的那个嵌套的循环,复杂度是 O(n^2)量级的,而同学虽然也写了两个循环,但这两个循环是独立的,都是O(n)量级的,相当于乘了常数2罢了,但是常数并不会影响复杂度的量级于是又回去看了下数据(就放2个好了,只有2个是真正有用的)200000 45000计算day = 155000, day * k = 6975000000,如果用嵌套的循环,想来复杂度上需要作出很大的牺牲突然就想起当时看数据结构的mooc时,老师说的那句话了,他说,一道题能直接看出来的解法,往往都不是复杂度上最优的解法,这次就是太想当然了,日后一定要谨慎!所有题目都要多想一点,想深入一点...我就说这题做的时候怎么感觉这么简单,看吧,太轻视就就TLE了...*/



//#include <iostream>//#include <iomanip>#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 10;typedef long long LL;int a[N];int main(){/*cin.tie(0);    cin.sync_with_stdio(false);*/int n, k;cin >> n >> k;for (int i = 0; i < n; i++)cin >> a[i];double sum = 0, tp = 0;int day = n - k + 1;for (int i = 0; i < k; i++)tp += a[i];for (int j = 0; j < day; j++){if (!j)sum += tp;else{tp -= a[j - 1];tp += a[j+k-1];sum += tp;}}double ans = sum * 1.0 / day;//cout << "sum = " << sum << endl << "day = " << day << endl;cout << fixed << setprecision(10) << ans << endl;return 0;}