Coins and Queries

本文介绍了一个算法问题,任务是根据给定的零、一数量及变化位置数构造一个符合要求的二进制字符串。文章提供了完整的输入输出示例及C++实现代码。

You are given three integers a, b and x. Your task is to construct a binary string s of length n=a+b such that there are exactly a zeroes, exactly b ones and exactly x indices i (where 1≤i<n) such that si≠si+1

. It is guaranteed that the answer always exists.

For example, for the string "01010" there are four indices i

such that 1≤i<n and si≠si+1 (i=1,2,3,4). For the string "111001" there are two such indices i (i=3,5

).

Recall that binary string is a non-empty sequence of characters where each character is either 0 or 1.

Input

The first line of the input contains three integers a

, b and x (1≤a,b≤100,1≤x<a+b)

.

Output

Print only one string s

, where s is any binary string satisfying conditions described above. It is guaranteed that the answer always exists.

Example

Input

5 4
2 4 8 2 4
8
5
14
10

Output

1
-1
3
2

 

 

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <cstdio>
#include <vector>
#include <numeric>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define PI acos(-1)
#define INF 0x3f3f3f3f
using namespace std;
const int N=200000 + 10 ;
typedef long long  LL;
const int dir[4][2]= { {1,0},{0,1},{-1,0},{0,-1} };

int GCD(int a,int b)
{
    return b ? GCD(b,a%b) : a;
}


int main()
{
    LL i,m,n,tra,fac=1;
    cin>>m>>n;
    map<LL,LL >mp;
    for(i=1; i<32; i++)
        fac*=2;
    for(i=0; i<m ; i++)
    {
        scanf("%lld",&tra);
        mp[tra]++;
    }
    for(i=0; i<n; i++)
    {
        LL ans=0,num,div=fac,dived,k;
        scanf("%lld",&dived);
        for(k=1; k<=32; k++)
        {
            num=min(dived/div,mp[div]);
            dived-=num*div;
            ans+=num;
            if(dived==0)
                break;
            div/=2;
        }
        if(dived!=0)
            printf("-1\n");
        else
            printf("%lld\n",ans);
    }
    return 0;
}

 

请用c++算法来完成本题,代码禁止有注释 G 货币系统 作者 UESTC 单位 电子科技大学 给定一个长度为 n 的升序数组 A,第 i 项的值为 A i ​ ,其中 A 1 ​ =1。 用这个数组构建一个货币系统,对于任意正整数 x,定义换钱张数函数为 f(x,n),其中 n 为数组长度。这个函数表示使用这一套货币系统支付 x 元时,如果要满足尽量先拿大面额纸币再拿小面额纸币的原则,需要拿出多少张纸币。对于任意正整数 x 和一个正整数 y∈[1,n],f(x,y) 满足: f(x,y)={ ⌊ A y ​ x ​ ⌋+f(xmodA y ​ ,y−1) x ​ y>1 y=1 ​ 你需要处理 q 组询问,每一组询问会给出一个整数 m,请回答有多少个正整数 x 满足 f(x,n)=m。 输入格式: 输入第一行有两个正整数 n 和 q(1≤n≤10 5 ,1≤q≤10 6 ),表示数组 A 的长度和询问次数。 第二行有 n 个正整数 A 1 ​ ,A 2 ​ ,…,A n ​ (1=A 1 ​ <A 2 ​ <…<A n ​ ≤10 6 ),表示数组 A。 第三行有 q 个整数 m 1 ​ ,m 2 ​ ,…,m q ​ (1≤m i ​ ≤10 9 ),其中 m i ​ 表示第 i 次询问的整数。 输出格式: 输出一行 q 个用空格隔开的整数,第 i 个整数表示第 i 次询问的答案。 输入样例: 6 2 1 5 10 20 50 100 1 2 输出样例: 6 18 样例解释 对于样例,给出的货币系统中纸币面额有 1 元、5 元、10 元、20 元、50 元和 100 元六种。按照规则,当你要支付 6 元时只能拿出两张纸币,即一张 1 元和一张 5 元,也就是 f(6,6)=2。虽然支付 6 元也可以使用六张 1 元,但是这种方案并不满足尽量拿大面额纸币的原则,也不满足本题函数的定义。 代码长度限制 50 KB Java (javac) 时间限制 2000 ms 内存限制 512 MB Python (python3) 时间限制 2000 ms 内存限制 512 MB Python (pypy3) 时间限制 2000 ms 内存限制 512 MB 其他编译器 时间限制 1000 ms 内存限制 512 MB 栈限制 131072 KB
最新发布
10-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值