每日一题~区间合并(贪心),矩阵旋转求和(坐标之间的关系)

在这里插入图片描述
被卡住 是因为没有 反应过来**,矩阵旋转之后对应的坐标。**
这道题思路 很简单,四次旋转是一个循环,处理出来第k次旋转道点i j 的值,就可以了。

#include <bits/stdc++.h>
#define int long long 
const int N = 15;
int map[N][N];
int a[5][N][N];
int b[N][N];
signed main()
{
	std::cin.tie(nullptr)->sync_with_stdio(false);
	int n;
	while (std::cin >> n)
	{
	b数组 处理的是 四次旋转的和,也就死一次循环的和
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				b[i][j] = 0;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
			{
				std::cin >> map[i][j];
				a[0][i][j] = map[i][j];
			}
			这三层for 套的有点dp的意思了
		for (int k = 1; k < 4; k++)
			for (int i = 0; i < n; i++)
				for (int j = 0; j < n; j++)
					a[k][i][j] = a[k - 1][n - j - 1][i];

		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				for (int k = 0; k < 4; k++)
					b[i][j] += a[k][i][j];

		int k; std::cin >> k;
		int cnt = k / 4;
		int left = k % 4;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
			{
				map[i][j] = cnt * b[i][j];
				for (int k = 0; k <= left; k++)
					map[i][j] += a[k][i][j];
			}
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (j==0)
					std::cout << map[i][j];
				else std::cout << " " << map[i][j];
			}
			std::cout << "\n";
		}
	}
	return 0;
}

区间合并的问题。
在这里插入图片描述
维护的区间的左右端点st ed,如果现在枚举到的区间 的左端点小于 ed,说明可以合并。那么新区间的end就是 end和这个合并区间右端点取最大值。
如果现在枚举到的区间 a,的左端点 大于ed,说明不能合并,并且因为我们是按照 左端点 升序,所以后面的区间都不能和我们现在维护的区间合并了。所以st ed这个区间,就可以push进我们的答案数组了。之后将st ed 设置a的左端点和右端点的值。最后将我们正在维护的区间 push进答案数组里面。

#include <bits/stdc++.h>
void solve(int n)
{
    std::vector<std::pair<int,int>>a(n);
    for (int i=0;i<n;i++)
  { std::cin>>a[i].first;
    std::cin>>a[i].second;
  }
  std::sort(a.begin(),a.end());
  int st=-100,ed=-100;
  std::vector<std::pair<int,int>>ans;
  for (auto i:a)
  {
    if (ed<i.first){
        if (st!=-100)ans.push_back({st,ed});
        st=i.first;ed=i.second;
    }else {
        ed=std::max(i.second,ed);
    }
  }
  if (st!=-100)ans.push_back({st,ed});
  for (auto i:ans)
  {
    std::cout<<i.first<<" "<<i.second<<"\n";
  }
    std::cout<<"\n";
}
int main()
{
   int n;
   while(std::cin>>n)
   {
    solve(n);

   }
    return 0;
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值