牛客練習賽34
阿新 • • 發佈:2019-01-14
https://ac.nowcoder.com/acm/contest/297#question
A題
偶數不變,奇數-1,用字串處理
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 100; const int INF = 0x3f3f3f3f; const int mod = 998244353; int main() { string s; int T; cin >> T; while(T --){ cin >> s; if((s[s.size()-1]-'0')%2){ s[s.size()-1] = (s[s.size()-1]-'0')-1 + '0'; } cout << s << '\n'; } return 0; }
B題
map存一下數字的個數,求負數和s1,正數和s2,看判斷s1+s2的結果
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 100; const int INF = 0x3f3f3f3f; const int mod = 998244353; map<int,int> m; int n,t; int main() { ll s1,s2; s1 = s2 = 0; cin >> n; for(int i = 1;i <= n;i ++){ cin >> t; m[t] ++; if(t >= 0) s1 += t; else s2 += t; } if(abs(s1+s2)%2) cout << -1 << endl; else{ printf("%d\n",m[(s1+s2)/2]==0?-1:m[(s1+s2)/2]); } return 0; }
C題
用差分陣列d記錄下覆蓋情況,然後求遍字首和,當差分陣列d中某個位置d[i]為0時,則表示此時這個點沒有被覆蓋,d[i]為1時記錄下來,對應字首和陣列s[i] += 1,此時表示僅有一條邊覆蓋,大於1就是多邊覆蓋了,最終對字首和陣列求區間差找最小即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 100; const int INF = 0x3f3f3f3f; const int mod = 998244353; int l[N],r[N],d[N],s[N]; int main() { int n,m; cin >> n >> m; for(int i = 1;i <= m;i ++) cin >> l[i] >> r[i],d[l[i]] ++,d[r[i]+1] --; int cnt = 0; for(int i = 1;i <= n;i ++){ s[i] += s[i-1]; d[i] += d[i-1]; if(!d[i]) cnt ++; if(d[i]==1) s[i] ++; } int ans = INF,pos; for(int i = 1;i <= m;i ++){ int tmp = s[r[i]] - s[l[i]-1]; if(tmp <= ans){ ans = tmp; pos = i; } } cout << pos << " " << ans+cnt <<endl; return 0; }
D題
先把所有面值從小到大排個序,設s為當前面值總和,設x = s + 1 x的意義是需要湊的面值
第一個數必須為1,第二個數可以為1,也可以為2,但是不能為3 如果為3的話面值為2的情況就湊不出來了
所以是 當前面值a[i] <= x 才可以 如果滿足的話 則 s+a[i]更新下一次需要湊的面值 最後再判斷是不是大於等於m
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 100;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
int n,m;
int a[1005];
int main()
{
ll s = 0;
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin >> a[i];
sort(a + 1,a + n + 1);
for(int i = 1;i <= n;i ++){
if(a[i] <= s + 1){
s += a[i];
}else{
break;
}
}
if(s >= m)
cout << "YES" << '\n';
else
cout << "NO" << '\n';
return 0;
}