zoukankan      html  css  js  c++  java
  • Codeforces Beta Round #96 (Div. 1) D. Constants in the language of Shakespeare 贪心

    D. Constants in the language of Shakespeare

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/contest/132/problem/D

    Description

    Shakespeare is a widely known esoteric programming language in which programs look like plays by Shakespeare, and numbers are given by combinations of ornate epithets. In this problem we will have a closer look at the way the numbers are described in Shakespeare.

    Each constant in Shakespeare is created from non-negative powers of 2 using arithmetic operations. For simplicity we'll allow only addition and subtraction and will look for a representation of the given number which requires a minimal number of operations.

    You are given an integer n. You have to represent it as n = a1 + a2 + ... + am, where each of ai is a non-negative power of 2, possibly multiplied by -1. Find a representation which minimizes the value of m.

    Input

    The only line of input contains a positive integer n, written as its binary notation. The length of the notation is at most 106. The first digit of the notation is guaranteed to be 1.

    Output

    Output the required minimal m. After it output m lines. Each line has to be formatted as "+2^x" or "-2^x", where x is the power coefficient of the corresponding term. The order of the lines doesn't matter.

    Sample Input

    1111

    Sample Output

    2
    3

    HINT

    题意

    给你一个2进制的数,然后要求你由+2^x和-2^x来构成这个数

    使得需求的数最少 

    题解:

    感觉好像是DP的样子,但是我DP灰常鶸,那就贪心咯

    对于每一段连续的1,我们可以一个一个的点,也可以点开头然后灭掉结尾,很显然,当长度大于等于2的时候,第二种策略更加优秀

    但是这儿有一个坑点,11101111,这个数据,答案是3

    所以我们还要合并一次就行了~

    代码:

    //qscqesze
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <bitset>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define maxn 1100000
    #define mod 1001
    #define eps 1e-9
    #define pi 3.1415926
    int Num;
    //const int inf=0x7fffffff;
    const ll inf=999999999;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    //*************************************************************************************
    
    string s;
    int flag[maxn];
    int main()
    {
        cin>>s;
        int n = s.size();
        for(int i=0;i<n;i++)
            if(s[i]=='1')flag[n-1-i]=1;
        for(int i=0;i<n;i++)
        {
            if(flag[i]==0)
                continue;
            int j = i;
            while(flag[j])j++;
            if(j-i>=2)
            {
                flag[i]=-1;
                for(int k=i+1;k<=j;k++)
                    flag[k]=0;
                flag[j]=1;
            }
            i=j-1;
        }
        int tot=0;
        for(int i=0;i<=n;i++)
            if(flag[i]==1||flag[i]==-1)
                tot++;
        printf("%d
    ",tot);
        for(int i=0;i<=n;i++)
        {
            if(flag[i]==0)
                continue;
            if(flag[i]==1)
                printf("+2^%d
    ",i);
            else
                printf("-2^%d
    ",i);
        }
    }
  • 相关阅读:
    Python 最强 IDE 详细使用指南!-PyCharm
    Python中最常用的字符串方法!
    转:用 Python 一键分析你的上网行为, 看是在认真工作还是摸鱼
    python中hasattr()、getattr()、setattr()函数的使用
    下载图片到本地,保存字符串内容到本地
    根据经纬度算出两个位置之间的距离
    根据日期获取星座和生肖
    java去除字符串的html标签
    java环信服务端注册IM代码
    linux命令
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4789865.html
Copyright © 2011-2022 走看看