CodeForces

来源:互联网 发布:linux 显示行号的命令 编辑:程序博客网 时间:2024/06/06 03:43

题目链接:http://codeforces.com/problemset/problem/663/A

题目大意:找出1-n的数字把?填起来,使等式成立

解题思路:当加最小,减最大都比n大的话,肯定不存在方案,当加最大,减最小都比n小的话,肯定不存在方案,存在方案的情况下,可以让所有的加都是n,所有的减都是1,如果比n大的话,加的往下减,减的往上加

AC代码:

#include<cstdio>#include<cstring>using namespace std;const int MAXN = 100000;char gt[MAXN];int pt[MAXN];int main(){    int plus = 1, minus = 0, pos=0, n=0;    for (char c;(c=getchar())!='\n';)    {        gt[pos++] = c;        if (c == '+')            plus++;        else if (c == '-')            minus++;        if(c>='0'&&c<='9')            n = c - '0' + 10 * n;    }    if (n*plus - minus<n || plus - minus*n>n)        puts("Impossible");    else    {        puts("Possible");        int left = n*plus - minus - n;        for (int i = 0;i < plus;++i)            pt[i] = n;        for (int i = 0;i < minus;++i)            pt[i + plus] = 1;        for (int i = 0;i < plus&&left;++i)        {            if (left > n - 1)            {                pt[i] = 1;                left -= n - 1;            }            else            {                pt[i] = n - left;                left = 0;            }        }        for (int i = 0;i < minus&&left;++i)        {            if (left > n - 1)            {                pt[plus + i] = n;                left -= n - 1;            }            else            {                pt[plus + i] = 1 + left;                left = 0;            }        }        int i = 1, j = plus;        printf("%d", pt[0]);        for (int k = 0;k < strlen(gt);++k)        {            if (gt[k] == '+')                printf(" + %d", pt[i++]);            else if (gt[k] == '-')                printf(" - %d", pt[j++]);            else if (gt[k] == '=')                printf(" = %d", n);        }    }    return 0;}
原创粉丝点击