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