競プロ日記

プロコン参加記録とか解いた問題とか

【CODEFORCES】Weird Rounding

CODEFORCEの問題を解いた.

http://codeforces.com/contest/779/problem/B

難しさ(初心者目線)

・考え方*

・実装*

・面白さ*

問題

コウタ君は数を10^{k}で割るのが大好きです.
今日は整数nを10^{k}で割ろうと思います.
コウタ君はnが10^{k}で割り切れないと怒るので、 割り切れるようにいくつかの桁の数字を削除してあげてください.
削除すべき数の最小値を出力してください.
最上位の桁は0ではありません.
削除したら桁が1つ少なくなります.
例えば30020で十の位の2を削除したら3000になります.
削除する必要がない場合は0を出力してください.

入力

0≦n≦2 000 000 000(整数)
1≦k≦9(整数)

出力

最小値を出力

ヒント

コード

WhyamIhereさんのコード参考にしました.

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <cmath>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

#define pb         push_back
#define mp         make_pair
#define ll         long long
#define PI         acos(-1.0)
#define ALL(A)     ((A).begin(), (A).end())
#define vsort(v)   sort(v.begin(),v.end())
#define FOR(I,A,B) for(int I = (A); I < (B); ++I)

int main(){
    //stringに格納した方が楽
    string s;
    int k;
    cin >> s >> k;

    //0の数を数える
    int zero = 0;
    FOR(i, 0, s.length()){
        if(s[i]=='0') zero++;
    }

    int dels = 0;
    //0の数が1の位から数えてkになると割り切れる
    if(k <= zero){
        zero = 0;
        for(int i=s.length()-1; i>=0; --i){
            if(s[i]=='0'){
                zero++;
            }else{
                dels++;
            }
            if(zero>=k) break;
        }
        cout << dels << endl;
        return 0;
    }
    //0にしないと割り切れない(0はどんな数字でも割り切れる)
    else{
        cout << s.length()-1 << endl;
        return 0;
    }
}

コメント

string使えばよかった.