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;
}

被折叠的 条评论
为什么被折叠?



