acwing 37场周赛

合适数对

传送门

题解:我们只需要进行一次以a的倍数为循环节点,以a*x<=n为限制条件的循环即可
code:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int st;

int main(){
    int n, a, b;
    cin >> n >> a >> b;
    for (int i = 0; b*((n - a*i)/b) <= n - a*i; i ++ ){
        if ((n - a*i)%b==0){
            cout << "YES" << endl;
            cout << i << " " << (n - a*i)/b;
            st = 1;     
            break;
        }
    }
    if(!st) cout << "NO";
    return 0;
}

截断数组

传送门

题解:我们先求前缀和,该数组分为三部分s1,s2,s3,我们要求s3的和等于s1的和,并且要求s1尽量大,我们使用hash表,判断是否存在s3,使得前缀和a[i] 等于 a[n]-a[i-1]
code:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>

using namespace std;

typedef long long ll;

const int N = 2e5 + 10;

ll a[N];

int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        a[i] += a[i - 1];
    }
    
    unordered_set<ll> hash;
    hash.insert(a[1]);
    
    for (int i = 2; i <= n; i ++ ){
        ll s3 = a[n] - a[i - 1];
        if (hash.count(s3)){
            printf("%lld",s3);
            return 0;
        }
        hash.insert(a[i]);
    }
    cout << 0;
    return 0;
}

搭档

传送门

题解:贪心+双指针,我们要求尽量多的男女生匹配,首先升序排序,指针分别指向男女队列的队头,若两者数值差值小于等于1,满足条件,双指针右移,若男生数值大,让女生的指针右移直到匹配位置,反之亦然
code:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int N = 220;

int a[N],b[N];

int main(){
    int n,m;
    cin >> n;
    for (int i = 1; i <= n; i ++)
        cin >> a[i];
    cin >> m;
    for (int i = 1; i <= m; i ++)
        cin >> b[i];
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    int i = 1, j = 1;
    int ans = 0;
    while(i <= n && j <= m){
        if(abs(a[i] - b[j]) <= 1) ans ++, j++, i ++;
        else if (a[i] > b[j]) j ++;
        else if (a[i] < b[j]) i ++;
    }
    cout << ans;
    return 0;
}
posted @ 2022-02-05 21:46  Gsding  阅读(22)  评论(1)    收藏  举报