Codeforces Round #347 (Div. 2) B. Rebus

原创 2016年06月01日 09:53:17

题目链接:点击打开链接

B. Rebus
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a rebus of form ? + ? - ? + ? = n, consisting of only question marks, separated by arithmetic operation '+' and '-', equality and positive integer n. The goal is to replace each question mark with some positive integer from 1 to n, such that equality holds.

Input

The only line of the input contains a rebus. It's guaranteed that it contains no more than 100 question marks, integer n is positive and doesn't exceed 1 000 000, all letters and integers are separated by spaces, arithmetic operations are located only between question marks.

Output

The first line of the output should contain "Possible" (without quotes) if rebus has a solution and "Impossible" (without quotes) otherwise.

If the answer exists, the second line should contain any valid rebus with question marks replaced by integers from 1 to n. Follow the format given in the samples.

Examples
input
? + ? - ? + ? + ? = 42
output
Possible
9 + 13 - 39 + 28 + 31 = 42
input
? - ? = 1
output
Impossible
input
? = 1000000
output
Possible
1000000 = 1000000

 题意: 给你 ? + ? - ? + ? = n,包含多个?和+、-,其中?是1-n的整数,问是否存在这样的等式,如果存在输出“Possible"和任意一组,不存在输出”Impossile"。

思路:个人觉得字符串的输入是个很头疼的问题,最终用s[1010][1010]来解决,s[i]就等于"+"或“-”或“=”或“?"或"n",最后一个字符串是n,将它转换为数字n,遍历一个s数组,得到“+”的个数cnt1和“-”的个数cnt2;

     如果cnt1==0&&cnt2==0,意味着等式是? = n,输出n = n,即可; 

     第一个数肯定是被加起来的,所以cnt1+1个数被加起来,有cnt2个数被减掉,如果(cnt1+1)*n-cnt2*1<n的话肯定无解,同理(cnt1+1)-cnt2*n>n的话也无解;

     反之一定有解,将cnt1+1个数保存在a[1010]中,将cnt2个数保存在b[1010]中,接下来是贪心的做法,先初始化a[1~cnt1+1]=1,b[1~cnt2]=1;

     如果cnt1+1-cnt2>n,证明要减的更多,将他们尽可能均分给每一个减数:

     

cnt3=(cnt1+1-cnt2-n)/cnt2;
            for(h=1;h<=cnt2;h++)
            b[h]+=cnt3;
            cnt3=(cnt1+1-cnt2-n)%cnt2;
            if(cnt3>=1)
            for(h=1;h<=cnt3;h++) b[h]++;
    如果 cnt1+1-cnt2<n,证明要加的更多,同样的处理方法,这样可以保证每一个数都大于等于1且不会超过n:

   

  cnt3=(n-(cnt1+1-cnt2))/(cnt1+1);
            for(h=1;h<=cnt1+1;h++)
            a[h]+=cnt3;
            cnt3=n-(cnt1+1-cnt2)-cnt3*(cnt1+1);
            for(h=1;h<=cnt3;h++) a[h]++;
   下面附上AC代码:这题毕竟卡了很久,凌晨两点半睡不着又下床想了这种写法才过掉的

   

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    char s[1010][1010];int i=0,j,n=0,cnt1=0,cnt2=0,cnt3=1,a[1010],b[1010];
    while(scanf("%s",s[i])!=EOF)
    {
        if(strcmp(s[i],"?")==0||strcmp(s[i],"+")==0||strcmp(s[i],"-")==0||strcmp(s[i],"=")==0) i++;
        else break;
    }
    for(j=0;j<i;j++)
    {
        if(strcmp(s[j],"+")==0) cnt1++;
        if(strcmp(s[j],"-")==0) cnt2++;
    }
    int len=strlen(s[i]);
    for(j=len-1;j>=0;j--)
    {
        n+=(s[i][j]-'0')*cnt3;
        cnt3*=10;
    }
    //printf("%d %d\n",cnt1,cnt2);
    if(cnt1==0&&cnt2==0) printf("Possible\n%d = %d\n",n,n);
    else if(n+n*cnt1-cnt2<n||1+cnt1-cnt2*n>n) printf("Impossible\n");
    else
    {
        int h;
        printf("Possible\n");
        for(h=1;h<=cnt1+1;h++)
        a[h]=1;
        for(h=1;h<=cnt2;h++)
        b[h]=1;
        if(cnt1+1-cnt2>n)
        {
            cnt3=(cnt1+1-cnt2-n)/cnt2;
            for(h=1;h<=cnt2;h++)
            b[h]+=cnt3;
            cnt3=(cnt1+1-cnt2-n)%cnt2;
            if(cnt3>=1)
            for(h=1;h<=cnt3;h++) b[h]++;
        }
        else if(cnt1+1-cnt2<n)
        {
            cnt3=(n-(cnt1+1-cnt2))/(cnt1+1);
            for(h=1;h<=cnt1+1;h++)
            a[h]+=cnt3;
            cnt3=n-(cnt1+1-cnt2)-cnt3*(cnt1+1);
            for(h=1;h<=cnt3;h++) a[h]++;
        }
        //for(h=1;h<=cnt1+1;h++) printf("%d ",a[h]);
        printf("%d ",a[1]);
        int m,x;m=2;x=1;
        for(h=1;h<i-1;h++)
        {
            if(strcmp(s[h],"+")==0) printf("+ %d ",a[m++]);
            if(strcmp(s[h],"-")==0) printf("- %d ",b[x++]);
        }
        printf("= %d\n",n);

    }
}
//? + ? - ? - ? - ? - ? - ? = 5
//? + ? + ? + ? + ? + ? + ? + ? - ? = 5

版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #378 (Div. 2) E. Sleep in Class

链接:http://codeforces.com/contest/733/problem/E 题意:给一个只含'U'和'D'的字符串,U表示向右走,D表示向左走。每个格子踩一次之后翻转(U变D,D变...
  • Fsss_7
  • Fsss_7
  • 2016年11月15日 13:48
  • 359

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include ...
  • rowanhaoa
  • rowanhaoa
  • 2014年07月25日 14:39
  • 1483

Codeforces Round #347 (Div. 2) B. Rebus

You are given a rebus of form ? + ? - ? + ? = n, consisting of only question marks, separated by ari...
  • u014258433
  • u014258433
  • 2016年05月14日 00:03
  • 306

【解题报告】Codeforces Round #401 (Div. 2)

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017年02月25日 17:55
  • 415

Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforc...
  • qq_34731703
  • qq_34731703
  • 2017年02月03日 12:50
  • 501

Codeforces Round #315 (Div. 1)

Codeforces Round #315 (Div. 1)
  • u013023344
  • u013023344
  • 2015年08月16日 21:31
  • 1067

Codeforces Round #460 (Div. 2) D. Substring(拓扑排序)

题目链接题意:有一个n个点m条边的有向图,每个节点有一个字母,路径的权值是路径上相同字母的最大个数。求最大的路径权值。思路:因为只有26个字母,所以直接假设其中一个字母为相同字母数最大的字母。枚举每一...
  • cyf199775
  • cyf199775
  • 2018年02月01日 13:55
  • 44

Codeforces Round #343 (Div. 2) B. Far Relative’s Problem

B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megaby...
  • Code_KK
  • Code_KK
  • 2016年02月21日 14:11
  • 446

Codeforces Round #428 (Div. 2):D. Winter is here(组合数公式)

D. Winter is here time limit per test 3 seconds memory limit per test 256 megabytes input stan...
  • Jaihk662
  • Jaihk662
  • 2017年08月14日 14:52
  • 349

Codeforces Round #442 (Div. 2)

A. #include using namespace std; typedef long long ll; int main() { string s; cin >> s; ...
  • Egqawkq
  • Egqawkq
  • 2017年10月24日 02:15
  • 241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #347 (Div. 2) B. Rebus
举报原因:
原因补充:

(最多只允许输入30个字)