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

京公网安备 11010502036488号