首页 > 其他分享 >【ABC 301】D 思维

【ABC 301】D 思维

时间:2023-05-14 16:25:11浏览次数:32  
标签:思维 ABC int 301 ll len ++ long ans

D

这道题被卡了很久。。。惭愧。。。

题意

给你一个由\([0, 1, ?]\)组成的字符串\(S\)和一个数\(N\)(\(N \leq 10^{18}\)),你可以把一个 \(?\) 变成 0 或者 1,问\(S\)最大能表示的不超过\(N\)的数是多少。

正解

先判断 -1 的情况:S能表示的最小的数是所有❓都填0所表示的数字,如果这个数都大于\(N\),肯定是无解的,否则有解

策略:如果某一位❓填1仍然\(\leq N\),就填1,否则填0

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
string s, t;
ll n, ans;

int main() {
    cin >> s >> n;
    int len = s.length(); 
    for(int i = 0; i < len; i++) {
        if(s[i] == '1') ans |= (1ll << (len - 1 - i));
    }
    if(ans > n) {
        puts("-1");
        return 0;
    }
    for(int i = 0; i < len; i++) {
        if(s[i] == '?') {
            if((ans | (1ll << (len - 1 - i))) <= n) ans |= (1ll << (len - 1 - i));
        }
    }
    printf("%lld\n", ans);
    return 0; 
}

我的错解

我的思路不是比较数值大小,是比较字符串(没过脑。。。。)

错的点在于考虑漏了一种情况(悲,修改后即可ac

debug超久总算ac的shishan代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
string s, t;
ll n;

int main() {
    cin >> s >> n;
    int len = s.length();   // 2 ^ [len - 1, ... ,0]

    // n转字符串
    for(int i = 0; i <= 60; i++) {
        if((n & (1ll << i)) != 0) t.push_back('1'), n -= (1ll << i);
        else t.push_back('0');
        if(!n) break;
    }
    reverse(t.begin(), t.end());
    // cout << "t :  " << t << endl; /// 

    // t更长 直接输出
    if(t.length() > len) {
        ll ans = 0;
        for(int i = 0; i < len; i++) {
            if(s[i] != '0') ans = ans * 2 + 1;
            else ans *= 2;
        }
        cout << ans << endl;
        return 0;
    }

    // t短 补全
    if(t.length() < len) {
        int times = len - t.length();
        for(int i = 1; i <= times; i++) t = "0" + t;
        // cout << "t :  " << t << endl; /// 
    }

    // 找 最初的上1下0 并看是否能补救    !!!!!!WA的原因:10之前可能已经有01了,修改后即可ac
    int flag = -1;
    bool occur = 0;
    for(int i = 0; i < len; i++) {
        if(s[i] == '1' && t[i] == '0' && !occur) {
            flag = i;
            break;
        }
        if(s[i] == '0' && t[i] == '1') {
            occur = 1;
            break;
        }
    }
    if(flag != -1) {
        bool ok = 0;
        for(int i = flag - 1; i >= 0; i--) {
            if(t[i] == '1' && (s[i] == '0' || s[i] == '?')) {
                ok = 1;
                s[i] = '0';
                break;
            }
        }
        if(!ok) {
            puts("-1");
            return 0;
        }
    }

    // 照搬 or 可以全1
    bool f = 0;
    for(int i = 0; i < len; i++) {
        if(s[i] == '?') {
            if(!f) s[i] = t[i];
            else s[i] = '1';
        }
        else {
            if(s[i] == '0') {
                if(!f && t[i] == '1') f = 1;
            }
        }
    }
    ll ans = 0;
    for(int i = 0; i < len; i++) {
        if(s[i] == '1') ans = ans * 2 + 1;
        else ans *= 2;
    }
    cout << ans << endl;
    return 0; 
}

总结

这次的D题让我想到了以前的很多时刻。

我总是这样,常常出现在写模拟题的时候,在思路还不明晰的时候匆忙开始,然后一直一直debug,最后还不保证能解决问题。

我把它总结为因为一时的懒惰而要花费巨大的代价(比如这次还用Mac对拍了,虽说这也是必备技能)去弥补。

得 不 偿 失 。

以后再遇到类似的情况,我一定要先在纸上写下清晰的过程,再开始做。

谢谢trq让我意识到这个问题,看来我还有很大的上升空间呀(

标签:思维,ABC,int,301,ll,len,++,long,ans
From: https://www.cnblogs.com/re0acm/p/17398921.html

相关文章

  • 正余弦优化算法(SCA)文章复现(非线权重改进位置更新+Levy飞行扰动策略+ABC算法思想)—
    正余弦优化算法(SCA)文章复现(非线权重改进位置更新+Levy飞行扰动策略+ABC算法思想)——SCASL复现内容包括:文章改进SCA算法实现、23个基准测试函数、文中相关因子分析、与SCA对比等。代码基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解。ID:23596702235796......
  • ABC254F 题解
    前言题目传送门!更好的阅读体验?这题trick就是更相减损术:\(\gcd\{a_1,a_2,a_3,\cdots,a_n\}=\gcd\{a_1,a_2-a_1,a_3-a_2,\cdots,a_n-a_{n-1}\}\)。思路有了这个trick之后这题就好做了。并不需要其他题解一样画表格,化简式子就行,过程并没有难点。\[\begin{a......
  • AtCoder Beginner Contest 301
    title:AtCoderBeginnerContest301categories:算法题解description:咕咕咕tags:-Atcoder-贪心-BFS-DPcover:/img/chino/vec/chino17.jpgkatex:truedate:2023-05-1322:47:31A-OverallWinner(abc301a)题目大意给定一个字符串表示高桥和青木......
  • STATA 字母 ABCDEF 转 123456
    clearinputstr10var1ABCDEFendcap:sscinstallsencodesavecishi1,replaceencodevar1,generate(var2)tostringvar2,replacegenvar4=tobytes(var1)genvar6=substr(tobytes(var1),3,.)genvar8=char(real(substr(tobytes(var1),3,.))-16) ......
  • cf 870div2 abcd题解
    A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立#include<iostream>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefdoubledb;typedefpair<int,int>PII;constllINF=0x3f3f3f3f;constintN=1e4+10;in......
  • 题解 ABC239F【Construct Highway】
    翻译:给定\(n,m\)和度数数组\(\{d_i\}\),再给你\(m\)条边,请构造一棵\(n\)点的树包含这\(m\)条边,且第\(i\)个点的度数为\(d_i\),或者判断无解。显然,若\(\sumd_i\ne2(n-1)\),则无解。然后对于输入的每条边,使用并查集维护,再求出在这\(m\)条边的基础上每个点还需要多......
  • collection.abc模块下的抽象基类UML类图说明
    说明Iterable、Container和Sized每个容器都应该继承这三个抽象基类,或者实现兼容的协议。Iterable通过__iter__方法支持迭代,Container通过__contains__方法支持in运算符,Sized通过__len__方法支持len()函数。Collection这个抽象基类是3.6新增的,自身没有方法,目的是方便子类化I......
  • 「题解」ABC241Ex Card Deck Score
    小时候最喜欢看的一集没有\(b_i\)怎么做?答案是\([x^m]\prod\frac{1}{1-a_ix}\),我们知道它可以分解为\(\sum\frac{R_i}{1-a_ix}\),其中\(R_i\)是一个常数。具体构造就是上面EI的blog,和中国剩余定理及其类似。那么\(R_i=\frac{1-a_ix}{\prod_j(1-a_jx)}\bmod(1-a_ix)\)......
  • Codeforces Round 683 (Div. 1, by Meet IT) ABCDF题解
    F和D都在ABC上做过类似的,但是没打好,道心破碎。。。。A.Knapsack若物品质量在[(w+1)/2,w]之间做完了否则一直贪心加voidsolve(){intn;llw;cin>>n>>w;intc=n;for(inti=1;i<=n;i++){cin>>a[i];if(a[i]>w)c--;}if(!c){......
  • 收藏!最全Linux思维导图
    收藏!最全Linux思维导图目录收藏!最全Linux思维导图1.认识Linux2.Linux命令3.Linux学习路径4.Linux桌面介绍5.FHS:文件系统目录标准6.Linux需要特别注意的目录7.Linux内核学习路线8.LinuxSecurityCoaching9.Linux命令参考10.Linux命令速查表11.最后:1.认识Li......