被卡住 是因为没有 反应过来**,矩阵旋转之后对应的坐标。**
这道题思路 很简单,四次旋转是一个循环,处理出来第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;
}