首页 > 其他分享 >Codeforces 1487F Ones

Codeforces 1487F Ones

时间:2024-04-15 21:25:23浏览次数:14  
标签:le int 10c underbrace Codeforces Ones Delta 考虑 1487F

考虑令 \(l = |n|\),最高位为第 \(1\) 位,最低位为第 \(l\) 位。

考虑选了一个 \(\pm\underbrace{11\cdots11}_{i}\),那么显然会对 \(l - i + 1\sim l\) 位都有影响。
于是能够知道第 \(i\) 位只有可能由 \(< i\) 的位影响。

便可以考虑由高位到低位依次考虑,假设到了第 \(i\) 位。
首先需要考虑 \(\le i\) 的位已经给第 \(i\) 位加了多少了。
同时考虑到 \(< i\) 的位可能给第 \(i\) 位留下了一些空去补。
同时考虑记录一下第 \(i\) 位选择 \(+ 1\) 还是 \(- 1\),显然不会又有 \(+1\) 又有 \(-1\)。

所以可以设 \(f_{i, x, c, \Delta}\) 分别代表上面的量对应的值所需要的最小花费。
考虑会有 \(2\) 种选择:

  1. 第 \(i\) 位 \(+ \Delta\),花费 \(1\),直接在 \(x\) 的部分 \(+ \Delta\) 即可。
    \(f_{i, x + \Delta, c, \Delta} + l - i + 1\to f_{i, x, c, \Delta}\)。
  2. 推到第 \(i + 1\) 位,那么第 \(i + 1\) 位就可能是 \(1\) 或 \(-1\),同时可以更新 \(c\),相当于前面的差值后面添上了这位的差值,就是 \(10c + s_i - \Delta\)。
    \(\min\{f_{i + 1, x, 10c + s_i - x, -1 / 1}\}\to f_{i, x, c, \Delta}\)。

边界条件就是当 \(i = l\) 的时候,要求到 \(i + 1\) 的时候 \(c = 0\) 才是合法的,相当于就是要使 \(10c + s_l - x' = 0\) 的 \(|x - x'|\) 的这个值,所以有 \(f_{l, x, c, ?} = |10c + s_l - x|\)。

但这个 \(c, x\) 的范围都会很大,但是考虑到大部分状态都是没用的,考虑减掉这部分状态。

首先考虑 \(x\)。
考虑到 \(\underbrace{77\cdots77}_{i} = \underbrace{11\cdots11}_{i + 1} - \underbrace{33\cdots3}_i - 1\),先把这个 \(-1\) 考虑到第 \(l\) 位已经特殊处理了,那么就可以知道实际上对于第 \(i\) 位来说不会操作 \(> 6\) 次。
那么一共有 \(l\) 位,操作次数就会 \(\le 6l\),于是有 \(x\le 6l\)。

再考虑 \(c\),考虑若 \(c \ge 0\),最后 \(c\) 肯定还是要满足最小值 \(\le 0\) 才有可能为 \(0\)。
考虑对于第 \(l\) 位的 \(c\),那肯定有 \(10c - x\le 0\)。
继续,有 \(10(10c - x) - x\le 0\),到了最后会成这样:\(c\le \dfrac{\underbrace{11\cdots11}_{l} x}{10^l}\)。
卡一个宽松的上界,肯定有 \(c\le \frac{x}{5}\)。

然后直接 \(\text{DP}\) 就行了。

时间复杂度 \(O(n^3)\)。

代码
#include<bits/stdc++.h>
const int inf = 0x3f3f3f3f;
const int maxl = 50 + 2, maxx = maxl * 6, maxc = maxx / 5;
char S[maxl];
int s[maxl];
int l, mxx, mxc;
int f[maxl][maxx << 1][maxc << 1][3];
int dfs(int w, int x, int c, int v) {
   if (w == l)
      return abs((c * 10 + s[w]) - x);
   if (x < -mxx || x > mxx || c < -mxc || c > mxc)
      return inf;
   int &ans = f[w][mxx + x][mxc + c][v + 1];
   if (ans == -1)
      ans = std::min({dfs(w, x + v, c, v) + l - w + 1, 
                      dfs(w + 1, x, c * 10 + s[w] - x, 1),
                      dfs(w + 1, x, c * 10 + s[w] - x, -1)});
   return ans;
}
int main() {
   scanf("%s", S + 1);
   l = strlen(S + 1);
   for (int i = 1; i <= l; i++)
      s[i] = S[i] - '0';
   mxx = l * 6, mxc = mxx / 5;
   memset(f, -1, sizeof(f));
   printf("%d\n", dfs(0, 0, 0, 1));
   return 0;
}

标签:le,int,10c,underbrace,Codeforces,Ones,Delta,考虑,1487F
From: https://www.cnblogs.com/rizynvu/p/18136922

相关文章

  • Educational Codeforces Round 164 (Rated for Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1954本来有机会上大分但是唐了E没调出来呃呃。小号比大号分高了呃呃以后想休闲直接打大号了哈哈A数学。若要将\(n\)个位置全部涂成颜色\(i\),则一定要修改\(n-\operatorname{count}(i)\)......
  • 【官方题解】Codeforces Round 939 (Div. 2)
    CodeforcesRoundAyachiNeneSolutions(div.2)A.Nene'sGameIdea:[user:Otomachi_Una]Solution不难发现如果一个人初始位置\(p\geqa_1\),那么必然会在有限次回合当中被踢出。答案即为\(\min(n,a_1-1)\)。B.NeneandtheCardGameIdea:[user:Otomachi_Una]Hint......
  • Educational Codeforces Round 164 (Rated for Div. 2) D
    因为理解错了题目导致我没错出来。我理解为有两个人取球,每个人每次都是取一组,也就是一组的球必须要放在一个人手里。。因为我之前做的一个背包是这个样子的。这就导致了,我认为每次转移所需要的信息是比实际要的多很多的,直接导致我没法设计一个正常的dp。然后炸了。。。好烦。。......
  • [CF1954] Educational Codeforces Round 164 (Rated for Div. 2) 题解
    [CF1954]EducationalCodeforcesRound164(RatedforDiv.2)题解A.PaintingtheRibbon最优策略是染\(\lceil\dfrac{n}{m}\rceil\)个颜色,然后Bob会把剩下的都染成这个颜色voidwork(){intn,m,k,c;cin>>n>>m>>k;c=(n+m-1)/m;......
  • Educational Codeforces Round 36 (Rated for Div. 2)
    EducationalCodeforcesRound36(RatedforDiv.2)A直接枚举即可#include<bits/stdc++.h>intmain(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);intn,k;std::cin>>n>>k;intans=1e9;for(int......
  • Educational Codeforces Round 154 (Rated for Div. 2)
    B和C写的太慢了。吃了不该吃的罚时,C还莫名其妙的T了一发,另一发也是不应该T的。B连想了两个假做法,然后甚至都实现了,然后过不了样例,再基于这两个才想到了真做法。当时的思路已经有些模糊了,但是确实是写的太慢了,而且\(O(n^2)\)的限制给的也很宽裕,但是我居然还傻乎乎的去先\(O(n^2)......
  • Bovine Bones G
    [USACO08OCT]BovineBonesG题面翻译贝茜喜欢玩棋盘游戏和角色扮演游戏,所以她说服了约翰开车带她去小商店.在那里她买了三个骰子。这三个不同的骰子的面数分别为s1......
  • Codeforces Round 893 (Div. 2) D
    链接第一个想法:\(O(n^2)\)可过,很明显,我可以直接统计出来每一个位置作为中心,向两边扩展最多能得到的多少个连续的1。这个想法是不成熟的,但是我甚至开始写了。哎。然后写了140行,发现寄了,思路太复杂,完全用不了。这里就引出了一个事情:太复杂的思路其实不能算是思路,因为表达是不可能......
  • Codeforces Round 938 (Div. 3) A-H 题解
    A-YogurtSaleSolution当\(2a>b\)时,显然用\(a\)来买两个比较好,否则就用\(b\)来买两个比较好Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;inta,b;cin>>a>>b;b=min(b,a*2);int......
  • Codeforces-182E 题解
    Vasyahasrecentlyboughtsomelandanddecidedtosurrounditwithawoodenfence.Hewenttoacompanycalled"Woodenboard"thatproduceswoodenboardsforfences.Vasyareadinthecatalogofproductsthatthecompanyhasatitsdisposal\(......