您的位置:首页 > 其它

Codeforces Round #347 (Div. 2) B. Rebus

2016-05-31 21:23 281 查看

题目链接:

http://codeforces.com/contest/664/problem/B

题意:

给你一个等式,把等式左边的问号用1到n(n为等式右边的数)的数填好,使得等式成立

题解:

贪心求出最小最大值,如果n在这个范围则有解,否则无解。

构造解: 取最小值或最大值,然后从第一个数开始调整,直到等式成立为止。

代码:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int maxn = 111;
const int INF = 1e9 + 7;

char str[maxn], sig[maxn];
int val[maxn],p1,p2;
int n;

void init() {
p1 = 0, p2 = 0;
sig[p1++] = '+';
}

int main() {
init();
while (scanf("%s", str) == 1 && str[0] != '=') {
if (str[0] == '?') {

}else{
sig[p1++] = str[0];
}
}
sig[p1] = '\0';
scanf("%d", &n);
int mi=0, ma=0;
vector<int> ans;
for (int i = 0; i < p1; i++) {
if (sig[i] == '+') mi += 1,ma+=n,ans.push_back(1);
else mi -= n,ma-=1,ans.push_back(n);
}
if (n >= mi&&n <= ma) {
int dis = n-mi;
for (int i = 0; i < p1; i++) {
if (sig[i] == '+') {
if (dis >= n - 1) {
ans[i] = n;
dis -= (n - 1);
}
else {
ans[i] += dis;
dis = 0;
}
}
else {
if (dis >= n - 1) {
ans[i] = 1;
dis -= (n - 1);
}
else {
ans[i] -= dis;
dis = 0;
}
}
if (dis == 0) break;
}
printf("Possible\n");
for (int i = 0; i < p1-1; i++) {
printf("%d %c ", ans[i], sig[i + 1]);
}
printf("%d = %d\n", ans[p1 - 1], n);
}
else {
printf("Impossible\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: