首页 > 其他分享 >CodeForces 1883E Look Back

CodeForces 1883E Look Back

时间:2024-07-28 15:52:28浏览次数:7  
标签:count cnt 1883E max ll 元素 Back CodeForces 次方

题目链接:CodeForces 1883E【Look Back】



思路

       若直接对每个元素进行操作累乘至大于相邻的前一个元素时,可能最后会数据溢出,而且乘的2个数可能会很多,会时间超限。所以可以对每两个相邻的元素进行判断,判断他们之间差了2的多少次方。cnt记录的是当前元素和上个元素之间差的2的cnt次方。如:数组a为1, 4, 1, 4, 9,i = 2时,count = -2,cnt = max(0, 0 + -2),i = 3时,count = 2,cnt = max(0, 0 + 2),此时cnt表示a[3]和a[2]之间差了2的cnt次方,后续在cnt的基础上操作代表上个元素需要乘2的cnt次方,此时直接将当前元素和上个元素比较原元素的大小关系加上之前求出的cnt就可以得到当前元素需要乘2的cnt次方 ,i = 4时,count = -2,cnt = max(0, 2 + -2),i = 5时,count = -2,cnt = max(0, 0 + -2)。


代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
ll a[N];
void solve() {
  ll n, res = 0;
  cin >> n;

  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }

  ll cnt = 0, ans = 0;
  for (int i = 2; i <= n; i++) {
    ll start = a[i - 1], target = a[i], count = 0;
    // 计算当前元素与上一个元素之间的差值
    while (start < target)
      count--, start *= 2;
    while (start > target)
      count++, target *= 2;
	// 综合上个元素的乘2次数,计算当前元素乘2的次数
    cnt = max(0ll, count + cnt);
    res += cnt;
  }

  cout << res << endl;
}

int main() {
  int t;
  cin >> t;

  while (t--) {
    solve();
  }
  return 0;
}

标签:count,cnt,1883E,max,ll,元素,Back,CodeForces,次方
From: https://www.cnblogs.com/againss/p/18328305

相关文章

  • CodeForces 1883D In Love
    题目链接:CodeForces1883D【InLove】思路    求能否找出两个区间不相交,所以将得到的区间先按区间左端点的大小从小到大排列,再按区间右端点的大小从小到大排列,此时取出最小的右端点和最大的左端点,若右端点在左端点左侧,则存在两个不相交的区间。由于需要动态操作增加减......
  • CodeForces 1883C Raspberries
    题目链接:CodeForces1883C【Raspberries】思路    依次枚举,特判k=4的情况,因为k=4可以由2个2拼凑起来,这2个2可以不在同一个元素上,如K=4时,数组a可以为2,3,2,5,7,9,此时数组中所有的元素乘积可以被4整除。若k=4时,此时数组中元素没有可以拆分出2的情况时,所有的......
  • Codeforces Round 962 (Div. 3) A - D详细题解(思路加代码Python,C++(垃圾灰名小白想
             吐槽一下,这次比赛不知道怎么的,可能是div3参加的人比较多吗,代码题解上去后全是inqueue,比赛的过程中我还看了提交的,80多页几千个提交全是inqueue,我的代码等了**半个多小时才运行,然后发现timelimit真的有点搞心态,思路在下一题我还要反过来去优化上一题,不过......
  • Codeforces Round 962 (Div. 3) CDE
    时间:2024-07-27C.Sort原题:C.Sort标签:前缀和题意给定字符串a,b定义\(sorted(a[l..r])\)表示将a的lr区间排序为有序有q次询问,每次给出区间l,r,要求通过操作使\(sorted(a[l..r])==sorted(b[l..r])\)操作为将\(a_i\)变成需要的任意字符,求最少次数思路一开始由于是div3,尝......
  • Codeforces Round 962(Div. 3)
    CodeforcesRound962(Div.3)A.legs题解:简单的贪心,可以对n预处理,将n除以2,此时可将动物视为1,则动物便是1条或两条腿,此时若是奇数才需要鸡,否则全部是牛便是最优解ShowCode#include<bits/stdc++.h>#defineANScout<<ans<<'\n'usingnamespacestd;voidsolve(){......
  • Codeforces Round 962(Div .3)
    CodeforcesRound962(Div.3)A.legs题解:简单的贪心,可以对n预处理,将n除以2,此时可将动物视为1,则动物便是1条或两条腿,此时若是奇数才需要鸡,否则全部是牛便是最优解ShowCode#include<bits/stdc++.h>#defineANScout<<ans<<'\n'usingnamespacestd;voidsolve(){......
  • 【做题笔记】板刷 CodeForces
    CF1987DWorldisMine第一想法是贪心的决策,考虑到是博弈论,每一轮决策肯定都是最优的。显然贪心做法假掉。发现问题具有最优子结构与后效性,考虑dp。将\(a_i\)数组排序,将相同元素打包成块,块长为\(b_{a_i}\)。设\(f_{i,j}\)表示以第\(i\)个块结尾,剩余决策数为\(j\)的最......
  • Codeforces Round 962 (Div. 3) 题解
    A.Legshttps://codeforces.com/contest/1996/problem/A翻译:农夫约翰的农场又迎来了美好的一天。农夫约翰来到农场后,数了数n条腿。众所周知,农场里只住着鸡和牛,一只鸡有2条腿,而一头牛有4条腿。假设约翰农场主数清了所有动物的腿,那么他的农场里最少有多少动物?思路求最少......
  • Codeforces Round 962 (Div. 3) 补题记录(A~G)
    这场Div.3难度高于平时。A#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;inta[N];signedmain(){intT;scanf("%lld",&T);while(T--){intn;scanf("%lld",......
  • Codeforces Round 961
    省流:运气好没有掉分)B2Bonquet(HardVertion)(CF1995B2)事实上B1都写挂了(尖叫)处理花瓣数相差不超过1的花,可以用map存储每种花的数量,顺序遍历即可(其实是不想排序统计,好麻烦);那么如何计算最终答案呢。。。此处省略我赛时乱七八糟的一堆复杂做法,比较简单的写法是先找到一个可行的......