您的位置:首页 > 其它

CodeForces Gym 100989L Plus or Minus (A) DFS

2016-07-14 18:12 316 查看
水题,DFS暴搜一发就行

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
#define ll long long
#define maxn 100005
int N;
int num[22];
ll numsum[22];
int initsign[22];
int nowsign[22];
char str[300];
int ans = 22;
int readint()
{
int tmp = 0;
char ch;
bool read = false;
while (ch = getchar())
{
if (ch >= '0'&&ch <= '9')
{
read = true;
tmp = tmp * 10 + ch - '0';
}
else if (read)
{
break;
}
else
{
continue;
}
}
return tmp;
}
char readchar()
{
char tmp = 0;
char ch;
bool read = false;
while (ch = getchar())
{
if (ch == '-' || ch == '+')
{
read = true;
tmp = ch;
}
else if (read)
{
break;
}
else
{
continue;
}
}
return tmp;
}
void work(int pos,ll sum)
{
if (pos == N - 1)
{
if (sum == 0)
{
int tmp = 0;
for (int i = 1; i < N; ++i)
{
if (initsign[i] != nowsign[i])
++tmp;
}
if (ans > tmp)
ans = tmp;
/*for (int i = 1; i < N; ++i)
printf("%d ", nowsign[i]);
printf("\n");
printf("%d\n", tmp);*/
}
return;
}
if (sum > numsum[pos + 1] || sum < -numsum[pos + 1])
return;
if (sum == numsum[pos + 1])
{
for (int i = pos + 1; i < N; ++i)
nowsign[i] = -1;
int tmp = 0;
for (int i = 1; i < N; ++i)
{
if (initsign[i] != nowsign[i])
++tmp;
}
if (ans > tmp)
ans = tmp;
/*for (int i = 1; i < N; ++i)
printf("%d ", nowsign[i]);
printf("\n");
printf("%d\n", tmp);*/
return;
}
else if (sum == -numsum[pos + 1])
{
for (int i = pos + 1; i < N; ++i)
nowsign[i] = 1;
int tmp = 0;
for (int i = 1; i < N; ++i)
{
if (initsign[i] != nowsign[i])
++tmp;
}
if (ans > tmp)
ans = tmp;
/*for (int i = 1; i < N; ++i)
printf("%d ", nowsign[i]);
printf("\n");
printf("%d\n", tmp);*/
return;
}
nowsign[pos + 1] = 1;
work(pos + 1, sum + num[pos + 1]);
nowsign[pos + 1] = -1;
work(pos + 1, sum - num[pos + 1]);
}
int main()
{
//freopen("input.txt", "r", stdin);
N = readint();
num[0] = readint();
char sign;
for (int i = 1; i < N; ++i)
{
sign = readchar();
if (sign == '-')
initsign[i] = -1;
else if (sign == '+')
initsign[i] = 1;
num[i] = readint();
}
/*for (int i = 0; i < N; ++i)
printf("%d ", num[i]);
printf("\n");
for (int i = 0; i < N; ++i)
printf("%d ", initsign[i]);
printf("\n");*/
for (int i = N - 1; i >= 0; --i)
{
numsum[i] = numsum[i + 1] + num[i];
}
/*for (int i = 0; i < N; ++i)
printf("%d ", numsum[i]);
printf("\n");*/
work(0, num[0]);
if (ans == 22)
printf("-1\n");
else
printf("%d\n", ans);
//system("pause");
//while (1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: