C1. Dual (Easy Version)(正负号转换)

该代码解决了一个Codeforces上的问题C1,主要涉及数组处理和算法设计。首先,对于全正数和全负数的数组,构造非减序列较为直接。接着,文章提出了将有正有负的数组转化为统一符号的方法,即找出并加上传统值最大的数,使得所有数的符号一致。然后提供了C++代码实现这一转换,并在符号统一后,根据正负情况生成满足条件的序列。
摘要由CSDN通过智能技术生成

 题目:Problem - C1 - Codeforces

 总结:

首先:对于全正数和全负数的数组求非减序列构造很是简单

紧接着:对于有正有负的数组可以将其转化为统一符号

最后符号统一方案:

找出绝对值最大的数并将每个数都将加上该绝对值的原数,即可符号统一化。

代码献上(正负号转换):

#include<iostream>

using namespace std;

int q[30];
int main() 
{
	int T;cin >> T;
	q[0] = 0;
	while (T--) 
	{
		int n; cin >> n;

		int f = 0;                                      //最大值坐标
		int ma = 0;                                     //最大值

		for (int i = 1; i <= n; i++) 
		{
			cin >> q[i];
			ma = max(ma, abs(q[i]));                    //筛选保存最大绝对值值
			if (abs(q[i]) == ma) f = i;                 //保存最大绝对值坐标
		}
	
		if (ma == 0)                                    //最大位置为 0
		{
			cout << 0 << endl;
			continue;
		}

		cout << n * 2 - 1 << endl;

		for (int i = 1; i <= n; i++)
			cout << i << " " << f << endl;            //将所有数值统一(同为正,同位负)


		if (q[f] > 0)
		{
			for (int i = 2; i <= n; i++)
				cout << i << " " << i - 1 << endl;  //两两加前
		}
		else
		{
			for (int i = n; i > 1; i--) 
				cout << i - 1 << " " << i << endl; //两两加后
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值