發表文章

目前顯示的是 8月, 2017的文章

[Codeforces] #422 (Div. 2)

題目連結: http://codeforces.com/contest/822 #A 啦啦啦 # include < iostream > using namespace std; int f (int a){return a == 1 ? 1 : a* f (a-1);} int main (){ int a,b;cin >> a >> b; cout << f( min (a,b)) << endl; } #B 窮舉 t 的子字串然後比較看哪一段的差異最小,並記錄是哪一段,最後再重新跑一次那一段,並輸出不一樣的位置。 # include < iostream > # include < string > using namespace std; int main (){ int n,m; cin >> n >> m; string s1,s2; cin >> s1 >> s2; int ans = 21474836,ans2; for(int i = 0 ; i < (m-n+1) ; i++){ int tmp = 0; for(int j = 0 ; j < n ; j++){ if(s1[j] != s2[j+i])tmp++; } if(ans > tmp)ans = tmp,ans2 = i; } cout << ans << endl; for(int j = 0 ; j < n ; j++){ if(s1[j] != s2[j+ans2]){ cout << j+1 << ' ';; } } return 0; } #C 可以按照 r-l+1 的數值分組。 窮舉所有旅途,要找x-(r-l)+1那組中不重複的區間的花費的最小,但因為你會窮舉所有旅

[TIOJ]1566. 簡單易懂的現代都市

題目連結: http://tioj.infor.org/problems/1566 可以使用單調對列優化,用deque維護區間最大值和區間最小值。 # include < iostream > # include < deque > # include < vector > # define F first # define S second # define ll long long using namespace std; typedef pair<ll, int > Pair; int main (){ int n,m; ll k; cin >> n >> m >> k; deque <Pair> mx,mn; vector<Pair> ans; int l = 1; for(int i = 1 ; i <= n ; i++){ ll a;cin >> a; if(i > m)l++; if(mx. size () && mx. front () .S + m <= i)mx. pop_front (); if(mn. size () && mn. front () .S + m <= i)mn. pop_front (); while(mx. size () && mx. back () .F < a)mx. pop_back (); while(mn. size () && mn. back () .F > a)mn. pop_back (); mx. push_back ({a,i}),mn. push_back ({a,i}); if(mx. front () .F - mn. front () .F == k && i-l >= 1)ans. push_back ({l,i});

[Codeforces] #421 (Div. 2)

題目連結: http://codeforces.com/contest/820 #A 就根據提意模擬就好 # include < iostream > using namespace std; int main (){ int c,v0,v1,a,l;cin >> c >> v0 >> v1 >> a >> l; int ans = 1,t = 0,s = v0; t += s; while(t < c){ t-=l; if(s+a > v1)s = v1; else s+=a; t += s; ans++; } cout << ans <<endl; return 0; } #B 題目有點難懂,我們只要固定1,2然後枚舉剩下的點即可。 # include < iostream > using namespace std; double abs (double x){return x < 0 ? -x : x;} int main (){ double n,a;cin >> n >> a; double h = (n-2)*180/n; double m = h/(n-2); double ans = 3; double k = abs(h - a); for(int i = 4; i <= n ; i++){ h -= m; if( abs (h - a) < k){ k = abs(h - a); ans = i; } } cout << "1 2 " << ans << endl; return 0; } #C 待編輯  #D 先預處理a[i]在 i 的左邊還是右邊,往右滑時總合會加在左邊的個數以及