题目链接
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"); } }