Codeforces Round 1055 A - Increase or Smash (2152)

https://codeforces.com/contest/2152/problem/A

A. Increase or Smash

Example

3

3

1 1 3

1

100

9

9 9 3 2 4 4 8 5 3

Output

3

1

11

第一个案例:STEP1 0 0 0 全部增加x=2,变成2 2 2,

STEP2 下降:2 2 2 部分元素x=-2,得到0 0 2

STEP3 再增加 1 1 3 全部+x=1

解题思路:执行下面2种类型的操作,除非元素满足题意。这两种类型,必须一起使用,成对出现,就是 STEP1 +x  , STEP2 -y,反复循环执行2步骤,完成目标。

所以操作*2,但是本身最大值,不需要,但是需要最后一步,大家一起变0,所以这里就是-1

operations=different element *2(升级+降级) -本身最大元素不需要2 + 本身最大元素要一起都变成0,这里就需要+1 

即=oper1=different element-1

题意是:你给我升级,但是也要降级,一起来,不能单独执行一个降级,我受不了。

如果单独执行降级,是可以达到目标,但是题目要求要一起升级降级2个步骤操作。在原来的基础上升级x+1,降级x-1即可,就是2个步骤,最大元素不需要,那么就-2,但最后需要一起变为0,就要+1.

题意是:1 升级 2 降级,一起执行操作。不能单独用一个。所以*2,而其中最大的值不需要,所以+2,但最后结果是0,那么就再-x得到,这个操作就+1

这样就说通了。以下是参考别人的代码,然后自己理解,转换为标准C++代码,并且吃透题意和代码。

英语的重要性:开始没明白,现在明白了。要成对执行1,2,最后一步就是-,或者说,要升级,接着要降级,这样反复+1-1这样波浪执行,不能单独一个不停的执行。或者只执行1个,下一个如果需要,就要波浪执行操作。


#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main()
{
	int diffient_cout = 0;
	int oper1 = 0;
	int t=0;
	cin >> t;
	while (t--)
	{
		int n=0;
		cin >> n;
		vector<int> list(n);

		//full in some different values
		set<int> different_element;

        for (int i = 0; i<n; i++)
		{
			cin >> list[i];
			
			if (list[i] != 0)
			{
				different_element.insert(list[i]);
			}
		}
		diffient_cout = different_element.size();

		// I do not understand the following....
		oper1 = 2 * diffient_cout - 1;
		// make all element to 0, every times by +-one number as one operation.
		cout<< oper1;
		cout<< endl;

	    diffient_cout = 0;
		oper1 = 0;
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值