题目链接

https://codeforces.com/problemset/problem/664/B

解题思路

由于每一个?只能取1-n,那么我们对于每一个?首先赋值为前面符号对应的+1或者-1,那么接下来就只需要在扫一边所有的数对这个答案进行调整就行了

AC代码

#include<bits/stdc++.h>
using namespace std;

const int N=1e6+10;

int num[N],n,f=1,pos,val;
char ch;

int main()
{
    while(cin>>ch)
    {
        if(ch=='?') num[pos++]=f,val+=f;
        if(ch=='+') f=1;
        if(ch=='-') f=-1;
        if(ch=='=') break;
    }
    cin>>n;

    for(int i=0;i<pos;i++)//这也太强了吧!!!Orz!!!
    {
        while(val<n&&num[i]>0&&num[i]<n) val++,num[i]++;
        while(val>n&&num[i]<0&&num[i]>-n) val--,num[i]--;
    }
    if(val!=n) puts("Impossible");
    else 
    {
        puts("Possible");
        cout<<num[0];
        for(int i=1;i<pos;i++)
        if(num[i]<0) cout<<" - "<<-num[i];
        else cout<<" + "<<num[i];
        cout<<" = "<<n<<endl;
    }
    return 0;
}

裂开

我直接裂开,绞尽脑汁实现细节,大佬草草几笔直接AC……
稍微记录一下我的思路,尽管是wa的:
思路1,也是最开始的wa思路:
第一个数总为n,其他的数跟着均为1,进行调整;特判n*(cnt[0]+1)-cnt[1]<n其中cnt[0]为+的个数,cnt[1]为-的个数,此时Impossible。(不知道特判对不对,全不全)
思路2,依旧是wa思路:
将+后面的设为n,-后面的设为1,再通过调整+后面的n实现相等。
感觉挺好,但是wa掉……
我裂开……

另附我的××代码(wa的)

#include<bits/stdc++.h>
#define pb push_back
using namespace std;

const int N=1e6+10;

int t,n,num,cnt[2],f;
char ch,pos[N];
vector<int> ans;

int main()
{
    while(cin>>ch)
    {
        if(ch=='?') continue;
        if(ch=='-') cnt[1]++;
        else if(ch=='+') cnt[0]++;
        else break; 
        pos[++t]=ch;
    }
    cin>>n;
    if(n==1) 
    {
        if(cnt[0]!=cnt[1]) puts("Impossible");
        else 
        {
            cout<<1;
            for(int i=1;i<=t;i++)
            cout<<' '<<pos[i]<<' '<<1;
            cout<<" = "<<1;
        }
    }
    else if(n*(cnt[0]+1)-cnt[1]<n) puts("Impossible");
    else 
    {

        /*
        if(cnt[0]>cnt[1]) f=1;
        else f=0;
        num=abs(cnt[0]-cnt[1]);
        ans.pb(n);
        for(int i=1;i<=t;i++)
        {
            if(pos[i]=='+') 
            {
                if(f==0) 
                {
                    if(num>n-1) ans.pb(n),num-=n-1;
                    else ans.pb(1+num),num=0;    
                }
                else ans.pb(1);

            }
            else if(pos[i]=='-')
            {
                if(f==1)
                {
                    if(num>n-1) ans.pb(n),num-=n-1;
                    else ans.pb(1+num),num=0;
                }
                else ans.pb(1);    
            }
        }
        int sum=0;
        if(cnt[1]==0)
        {
            for(int i=1;i<ans.size();i++)
            sum+=ans[i];
        }

        cout<<n-sum<<' ';
        for(int i=1;i<ans.size();i++)
        cout<<pos[i<<1]<<' '<<ans[i]<<' ';
        cout<<"= "<<n<<endl;
        */
        ans.pb(n);
        for(int i=1;i<=t;i++)
//        cout<<pos[i<<1]<<endl;
        if(pos[i]=='+') ans.pb(n);
        else if(pos[i]=='-') ans.pb(-1);
        int num=cnt[0]*n-cnt[1];
        int div=num/(n-1);
        int mod=num%(n-1);
        for(int i=0;i<ans.size();i++)
        {
            if(div)
            {
                if(ans[i]==n) ans[i]=1,--div;
                else continue;
            }
            else if(mod)
            {
                if(ans[i]==n) ans[i]-=mod,mod=0;
                else continue;
            }
        }
        if(mod==0 && div==0) 
        {
            puts("Possible");
            cout<<ans[0];
            for(int i=1;i<ans.size();i++)
            cout<<' '<<pos[i]<<' '<<(pos[i]=='-'?-ans[i]:ans[i]);
            cout<<" = "<<n<<endl;
        } 
        else puts("Impossible");

    }
}