首页 > 其他分享 >C. Sum of Substrings题解

C. Sum of Substrings题解

时间:2022-11-19 20:59:57浏览次数:79  
标签:cnt int 题解 Sum st -- Substrings pos2 pos1

C. Sum of Substrings

题目大概意思,给你一个01串,求和最小,其中和是该串所有相邻字符所组成的十进制数的和。
如:0110, sum = 01 + 11 + 10 = 22。
通过观察我们可以发现,除了第一个位置和最后一个位置,其他位置上的1对和的贡献都是11。
所以我们只需要特殊考虑挪1到第一个和最后一个位置上。
题目没说必须挪,所以我们可以不用挪。
另外,注意只有一个1的情况!

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int t, n, k;
char st[N];

signed main(){
    cin >> t;
    while(t --){
        cin >> n >> k;
        memset(st, 0, sizeof st);
        cin >> st;
        int pos1 = 0, pos2 = 0;
        int cnt = 0;
        bool flag = false;
        for(int i = 0; i < strlen(st); i++){
            if(pos1 == 0 && st[i] == '1' && flag == false){
                pos1 = i;
                flag = true;
            } 
            if(st[i] == '1') cnt ++;
        }
        for(int i = n - 1; i >= 0; i--){
            if(pos2 == 0 && st[i] == '1'){
                pos2 = i;
                break;
            }
        }
        if(cnt == 0){
            cout << 0 << endl;
            continue;
        }
        if(k == 0){
            int res = 0;
            if(st[0] == '1') res = 10, cnt --;
            if(st[n - 1] == '1') res += 1, cnt --;
            cout << res + cnt * 11 << endl;
            continue;
        }
        if(cnt == 1){
            if(k >= n - pos2 - 1){
                cout << 1 << endl;
            }
            else if(k >= pos1){
                cout << 10 << endl;
            }
            else cout << 11 << endl;
            continue;
        }
            int ans = 0;
            if(pos2 == n - 1){
                ans = 1;
                cnt --;
            }
            else{
                if(k >= n - pos2 - 1){
                    k -= n - pos2 - 1;
                    ans += 1;
                    cnt --;
                }
            }
            if(pos1 == 0){
                ans += 10;
                cnt --;
            }
            else{
                if(k >= pos1){
                    ans += 10;
                    cnt --;
                }
            }
            cout << ans + 11 * cnt << endl;
    }
    return 0;
}

标签:cnt,int,题解,Sum,st,--,Substrings,pos2,pos1
From: https://www.cnblogs.com/N-lim/p/16906991.html

相关文章

  • cf796部分题解
    C.ManipulatingHistory题意:给出一些字符串,有原始串(只含一个字符的串)、被替换的串、替换串、最终串(最后一行),求原始串。2aabbcdacdInitiallysis"a".Inthe......
  • B - Bracket Sequence题解
    B-BracketSequence思路:用一个flag来标记括号的数目,如果括号数目是个偶数的话,就代表当前要执行'+'操作,反之就是'*'操作。对于最外层的数,是没有计算的。所以最后要单独......
  • Auxiliary Set题解
    FAuxiliarySet树上LCA+DFS注意一下输出格式!#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intt,n,q,ans;intfa[N];//存储点i的......
  • 广东工业大学第十六届程序设计竞赛题解(部分)
    E爬塔方法一:二分做法预处理每个点所能到达的最远距离,存到vector里边,然后二分处理结果#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn,......
  • F - Subarrays题解
    F-Subarrays题意:给你一个序列,问这个序列里有多少个子串的和能被k整除。思路:求前缀和,然后每个位置对k取模,模数相等的位置之间,是一个满足条件的字串。因为求的是前缀和,......
  • G water testing题解
    Gwatertesting题意:给你一个多边形(可能是凸多边形,也可能是凹多边形),问该多边形内有多少个整数点(不包含边界)。思路:皮克定理+叉乘计算三角形面积:皮克定理是指一个计算点......
  • Frogger题解
    Frogger法一:floyd#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<iomanip>#defineintlonglongintusingn......
  • 2022 zafu校赛题解
    A煎饼哥哥好鲨题读入时,分别统计四种不同提交结果,最后按题目要求输出即可。代码链接B富哥磊神暴力枚举三种纸币的数量,统计合法付款方式的数量即可。注意优化暴力枚举......
  • python(牛客)试题解析2 - 中等
    导航一、NC192二叉树的后序遍历二、NC117 合并二叉树三、求长度最长的的连续子序列使他们的和等于sum四、按顺序取出固定长度内容并合并两个数组为一个新数组五、输......
  • python 安装Basemap 以及cannot import name ‘dedent’ from ‘matplotlib.cbook’问
    我用的是anaconda管理工具,运行安装condainstallbasemap或者直接在anaconda,navigator中搜索basemap,进行安装  问题:cannotimportname‘dedent’from‘matplot......