Source : Tehran 2003 | |||
Time limit : 1 sec | Memory limit : 64 M |
Submitted : 98, Accepted : 43
In this problem, you are to solve a very easy linear equation with only one variable x with no parentheses! An example of such equations is like the following:
An expression in its general form, will contain a '=' character with two expressions on its sides. Each expression is made up of one or more terms combined by '+' or '-' operators. No unary plus or minus operators are allowed in the expressions. Each term is either a single integer, or an integer followed by the lower-case character x or the single character x which is equivalent to 1x.
You are to write a program to find the value of x that satisfies the equation. Note that it is possible for the equation to have no solution or have infinitely many. Your program must detect these cases too.
Input
The first number in the input line, t (1 <= t <= 10) is the number of test cases, followed by t lines of length at most 260 each containing an equation. There is no blank character in the equations and the variable is always represented by the lower-case character x. The coefficients are integers in the range (0...1000) inclusive.
Output
The output contains one line per test case containing the solution of the equation. If s is the solution to the equation, the output line should contain [s] (the floor of s, i.e., the largest integer number less than or equal to s). The output should be IMPOSSIBLE or IDENTITY if the equation has no solution or has infinite solutions, respectively. Note that the output is case-sensitive.
Sample Input
2 2x-4+5x+300=98x x+2=2+x
Sample Output
3 IDENTITY
我是因为看到DP才做的。后来发现……
这个,其实就是模拟。但是模拟的水平有不同,像我的代码就特别不好。
然后记得floor是绝对值的取下限,所以-3.3会变成-3.但是题目要求他应该是-4才对。所以自己特殊处理下
由于是模拟,加上我的代码很差,这个就给我自己留下参考了……
#include <cstdio>
#include <cstring>
#include <cmath>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define erep(i,a,b) for(int i=a;i<=b;i++)
int t,len,eq,nm[2],xx[2];
char s[1009];
void op(int st,int ed,int fl){
int pn;
rep(i,st,ed){
pn=1;
if(s[i]=='-') pn=-1,i++;
else if(s[i]=='+') i++;
if(s[i]=='x') xx[fl]+=pn;
else{
int tmp=0;
erep(j,i,ed+1){
if(s[j]=='x'){
xx[fl]+=tmp*pn;
i=j;
break;
}else if(s[j]=='+'||s[j]=='-'||s[j]=='='){
nm[fl]+=tmp*pn;
i=j-1;
break;
}
tmp=tmp*10+s[j]-'0';
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--&&scanf("%s",s)){
nm[0]=nm[1]=xx[0]=xx[1]=0;
len=strlen(s);
rep(i,0,len)
if(s[i]=='=')
eq=i;
s[len]='=';
op(0,eq,0);
op(eq+1,len,1);
if(xx[0]==xx[1]&&nm[0]==nm[1])puts("IDENTITY");
else if(xx[0]==xx[1]&&nm[0]!=nm[1])puts("IMPOSSIBLE");
else{
if((nm[1]-nm[0])/(xx[0]-xx[1])>=0||(nm[1]-nm[0])%(xx[0]-xx[1])==0)printf("%d\n",(int)(floor(nm[1]-nm[0])/(xx[0]-xx[1])));
else printf("%d\n",(int)(floor((nm[1]-nm[0])/(xx[0]-xx[1]))-1));
}
}
}