2018校賽補題及反思
阿新 • • 發佈:2018-12-01
這次竟然如此多的省賽原題。。然而我全都忘掉了,看不懂看不懂,看懂了的不會做
被打成自閉,失去夢想變成鹹魚 //所以省賽的題沒有補,題目記不起來了的也沒補
補了兩題很多人做出來的
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
中文題一道都沒做出來,尷尬
(字型不知道為何如此小。。)
以上,就是我掛機四個半小時的全描述。