AtCoder Beginner Contest 294
E - 2xN Grid
Problem Statement
题意:给你\(2\)行长度为\(L\)的矩阵。告诉你格子里面的数字,以\(vi\) \(li\)的形式:\(vi\)有\(li\)个
问上下两个一样的有多少个?
解释:以样例为例
输入
8 4 3
1 2
3 2
2 3
3 1
1 4
2 1
3 3
输出
4
第$1,$2,\(5\),8个上下两个一样,ans++;
Solution
题解:首先如果想要把数字拆开放到数组里面再写是不现实的,那怎么办呢?对于上下比较,想到用双指针。用\(a[i]\)表示\(val\)用\(b[i]\)表示个数,我们考虑把第一行和第二行拼接起来,那左指针\(c = 1\),右指针\(d = n+1\)开始,如果\(a[c]==a[d]\) \(ans+=min(a[c],a[d])\)。
再考虑指针移动:
- 如果\(b[c]>b[d],b[c]-=b[d],d++\)。
- 如果\(b[c]<=b[d],b[d]-=b[c],c++\)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10;
int l,n,m;
int a[N],b[N];
signed main()
{
cin>>l>>n>>m;
for(int i = 1;i<=n;i++)
cin>>a[i]>>b[i];
for(int i = n+1;i<=n+m;i++)
cin>>a[i]>>b[i];
int c = 1,d = n+1;
int ans = 0;
while(c<=n&&d<=n+m)
{
if(a[c]==a[d])ans += min(b[c],b[d]);
if(b[c]>b[d])
b[c]-=b[d],d++;
else
b[d]-=b[c],c++;
}
cout<<ans<<endl;
return 0;
}