#include<bits/stdc++.h>usingnamespace std;constint maxn =505;int T, n;
string s;intmain(){ios::sync_with_stdio(0);cin.tie(0);cin >> T;while(T--){cin >> n;int len =0, ones =0, flag =0;for(int i =0; i < n; i++){cin >> s;if(s.length()&1) flag =1;for(int j =0; j < s.length(); j++)ones += s[j]-'0';}if(!flag &&(ones &1)) cout << n -1<< endl;else cout << n << endl;}return0;}
C. Minimize The Integer 題目大意:給一個數字串,我們可以交換任意次它相鄰且對應位不同為奇數或偶數的數,例如給定串"4532",4和5之間可以交換,4和3之間不能交換(不相鄰),5和3不能交換(因為都是素數)。最后要使得得到的數最小。 解法:按順序將奇數和偶數都提取出來,然后將奇數和偶數小的一方先填入,以此類推(有點像歸并排序)
PS:這個方法是借鑒scnucjh大佬的。
#include<bits/stdc++.h>usingnamespace std;constint maxn =505;int T;
string s;intmain(){ios::sync_with_stdio(0);cin.tie(0);cin >> T;while(T--){cin >> s;vector<int> a, b, ans;for(int i =0; i < s.length(); i++){int t = s[i]-'0';if(t &1) a.push_back(t);else b.push_back(t);}int i =0, j =0;while(i < a.size()&& j < b.size()){//將小的數先填入串中if(a[i]< b[j]) ans.push_back(a[i++]);else ans.push_back(b[j++]);}//最后將剩余的部分也填入串中while(i < a.size()) ans.push_back(a[i++]);while(j < b.size()) ans.push_back(b[j++]);for(int i =0; i < ans.size(); i++)putchar(ans[i]+'0');putchar('\n');}return0;}
D. Salary Changing 題目大意:給定n個員工和s塊錢,每個員工要給的工資在[li,ri][l_i,r_i][li?,ri?]這個區間內,現在要使所給工資的中位數最大。 解法:最優化問題一般考慮二分法,為了保證找到的x可以成為中位數,我們先對li,ril_i,r_ili?,ri?從大到小排序,然后二分查找中位數的值。判斷條件主要考慮這個數能不能在中間位置,以及當它在中間位置是,是否夠錢支付給各個員工。
#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;constint maxn =2e5+10;int T, n;
ll s;struct People {int a, b;booloperator<(const People &p){return a^p.a ? a > p.a : b > p.b
;}} p[maxn];template<classT>intread(T &res){char c;int sgn;if(c =getchar(), c ==EOF)return0;while(c !='-'&&(c <'0'|| c >'9')) c =getchar();sgn =(c =='-')?-1:1;res =(c =='-')?0:(c -'0');while(c =getchar(), c >='0'&& c <='9') res = res *10+(c -'0');res *= sgn;return1;}template<classT>voidwrite(T x){if(x >9)write(x /10);putchar(x %10+'0');}template<classT>voidwriteln(T x){write(x);putchar('\n');}intcheck(ll x){ll cnt =0, half =(n +1)>>1, sum =0;for(int i =1; i <= n; i++){if(p[i].a >= x){sum += p[i].a;cnt++;}else{if(p[i].b >= x && cnt < half){sum += x;cnt++;}else{sum += p[i].a;}}}if(cnt < half)return0;return sum <= s;}intmain(){read(T);while(T--){read(n);read(s);for(int i =1; i <= n; i++){read(p[i].a);read(p[i].b);}sort(p +1, p + n +1);ll l =1, r =1e18, mid;while(l <= r){mid =(l + r)>>1;if(check(mid)) l = mid +1;else r = mid -1;}writeln(r);}return0;}