Nene‘s Magical Matrix

题目链接:Nene's Magical Matrix

思路:

首先我们思考一下,整个矩形最大的sum为多少?换句话说,忽略次数限制,最大sum的矩形每个数是怎么样分布的?

从中我们可以发现

1   2   3   4 

2   2   3   4

3   3   3   4

4   4   4   4

这样的矩形是最大的,因为不论怎么改变这样的矩形,行和列都是由1 ,2 ,3  ,4 。。。分布

只能把它变小并不能变大。

那么接下来考虑我们能否在2*n的次数里面变成这个矩形或者往这个矩形的形式上变?

首先为了减少次数,每次修改的行或者列最好都要使sum变大。

因此以3*3的矩形为例:

0   0   1          0    0    1         0    1    1        0    1    1           1   2   3          1   2   3

0   0   2  ==》0    0    2 ==》 0    2    3 ==》1   2   3  ==》  1   2   3  ==》1   2   3

0   0   3         1    2    3           1    3    3        3    3   3            3   3   3         1   2   3

这样就是最大的方法

(注意n=1和n=2要特判)

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;

void solve(){
	cin>>n;
	int sum=0;
	int m;
	if(n==1)m=1;
	else if(n==2)m=3;
	else m=2*n;
	int k=1;
	for(int i=1;i<=n;i++){
		sum+=k*(2*i-1);
		k++;
	}

	cout<<sum<<" "<<m<<"\n";

	if(n==1){//特判
		cout<<1<<" "<<1<<" "<<1<<"\n";
	}
	else if(n==2){
		cout<<1<<" "<<1<<" "<<1<<" "<<2<<"\n";
		cout<<1<<" "<<2<<" "<<1<<" "<<2<<"\n";
		cout<<2<<" "<<1<<" "<<1<<" "<<2<<"\n";
	}
	else{
		int pre=n;
		for(int i=1;i<=n*2;i++){
			if(i&1){
				cout<<1<<" "<<pre<<" ";
			}
			else {
				cout<<2<<" "<<pre<<" ";
				pre--;
			}
			for(int i=1;i<=n;i++){
				cout<<i<<" ";
			}
			cout<<"\n";
		}
	}

}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--){
		solve();
	}

	return 0;
}

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值