1. 程式人生 > >2018校賽補題及反思

2018校賽補題及反思

這次竟然如此多的省賽原題。。然而我全都忘掉了,看不懂看不懂,看懂了的不會做

被打成自閉,失去夢想變成鹹魚 //所以省賽的題沒有補,題目記不起來了的也沒補

補了兩題很多人做出來的

1.最後一題求K個連續和最大的下標

這題對我來說並沒有很簡單啊,回來還是寫了一個多小時emmmmm,所以沒有很可惜
可是為什麼別人能當場做出來呢,氣死我了

結論:

1/樣例模擬一定要自動地全面考慮,尤其是負數,0,無解(k比n大), 沒有意義的情況。。

 

2/。在技術還不行的時候不能有   想使空間複雜度最小   的潔癖。

(不熟練怎麼用結構體型別的vector,為什麼非得用vector呢。。)

 

附上午寫的經過自己測驗多種型別樣例沒有WA的。。

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <numeric>
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;

// int i;
// LL sum;
// struct P {				//不熟練怎麼用結構體型別的vector,為什麼非得用vector呢
// 	int index;
// 	LL s;
// 	P(int index = 0, LL s = 0) : index(i), s(sum) {}

// 	bool operator > (const P& a) const {

// 		return a.s < s;
// 	}
// };
// vector<int> v;
// vector<P> h;
const int maxn = 100000 + 24;
vector<int> v;
LL s[maxn];

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int k, x;
	//這題對我來說並沒有很簡單啊,回來還是寫了一個多小時emmmmm,所以沒有很可惜
	//可是為什麼別人能當場做出來呢
	
	//樣例模擬一定要自動地全面考慮,尤其是負數,0,無解(k比n大), 沒有意義的情況
	char ch;
	while(scanf("%d", &k) == 1) {
			v.clear();
			LL sum, res = -10000;
			int flag = 1;
			sum = 0;
			getchar();
			// while(scanf("%c", &ch) != EOF && ch != '#') {
			// 	x = ch - '0';	//這樣是不行的,因為如果是負數...
			// 	v.push_back(x);
			// 	getchar();
			// }
			while(scanf("%d", &x) == 1) {
				v.push_back(x);
			}
			getchar();//這個是為了清除輸入緩衝區的getchar(),否則就會不能實現多組輸入輸出
			int n = v.size();
			// for(int i = 0; i < n; i++) {
			// 	cout << v[i] << " ";
			// }
			// cout << endl;
			if(k <= 0)	cout << "-1" << endl;
			else if(k == 1)	{
				int _max = -10000;
				for(int i = 0; i < n; i++) {
					_max = max(_max, v[i]);
				}
				cout << _max << endl;
			}
			else if(k > n) {
				cout << "-1" << endl;
				//break;
			}
			else if(k == n) {
				cout << "0" << endl;
				//break;
			}
			else {
				for(int i = 0; i < n - k + 1; i++) {
					sum = 0; 
					// for(int j = 0; j < k; j++) {
					// 	sum += v[i+j];
					// }
					sum = accumulate(v.begin() + i, v.begin() + i + k, 0);
					s[i] = sum;
					res = max(res, sum);
					//cout << res << "\t" << sum << endl;
				}
				
				for(int i = 0; i < n - k + 1; i++) {
					if(s[i] == res) {
							if(flag) {
								cout << i+1;
								flag = 0;
							}
							else	cout << " " << i+1;
					}
				}
			}	
	}
	return 0;
}
/**/

 

2.貪心的那題,,當場就發現跟hdu2037解題方法,甚至可以說AC程式碼都一模一樣。。然而,,我不知道當時為什麼就是WA了到最後都沒能AC。

上午一把過了,真是神奇。

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int maxn = 100000 + 24;

struct P {
	int s, e;
	P(int s = 0, int e = 0) : s(s), e(e) {}

	bool operator < (const P& a) const {
		return e < a.e;
	}
};

P p[maxn];
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int k;
	while(cin >> k && k) {
		int i, s, e;
		for(i = 0; i < k; i++) {
			cin >> s >> e;
			p[i].s = s, p[i].e = e;
		}
		sort(p, p + k);
		int cnt = 1, t = p[0].e;
		for(i = 1; i < k; i++) {
			if(p[i].s >= t) {
				cnt++;
				t = p[i].e;
			}
		}
		cout << cnt << endl;
	}
	return 0;
}
/**/

 

 究其根本原因,可能是很久沒有使用結構體了,很生疏;

唉,還是要各種題型都練,還要訓練好思維方式。

 

記得還有一題排序算weight的,疑似組合數學,,然而看了一會根本想不出思路。。放棄了放棄了,枉我還借了一本組合數學的書假裝學了幾天combinatorial mathematics

中文題一道都沒做出來,尷尬

(字型不知道為何如此小。。)

 

以上,就是我掛機四個半小時的全描述。