• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
nannandbk
博客园    首页    新随笔    联系   管理    订阅  订阅
AtCoder Beginner Contest 294 E

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

img

第$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])\)。

再考虑指针移动:

  1. 如果\(b[c]>b[d],b[c]-=b[d],d++\)。
  2. 如果\(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;
}
posted on 2023-06-17 08:53  nannandbk  阅读(50)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3