1. 程式人生 > >牛客練習賽34

牛客練習賽34

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;
}