题目大意:
某人欠 A,B,C三个人a,b,c的钱。这个人现在有一些石头可以抵债。对于第i块石头,A,B,C三个人看待它的方式不同。比如若A觉得他是有价值的,则把这个石头给A的话就可以当还了
分析:
就是我们先枚举每个人的优先级,然后按照优先级贪心即可。
AC code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+9;
int s[3], n;
char b[MAXN][4];
int p[3], ts[3];
char tb[MAXN][4];
char name[4] = "POS", tname[4];
char ans[MAXN];
#define equal(a, b) (strcmp(a, b) == 0)
void upd(int i, int k)
{
if(tb[i][k] == 'B') ts[k] -= 2;
else ts[k]--;
ans[i] = tname[k];
}
void solve()
{
for(int i = 0; i < 3; ++i)
{
ts[i] = s[p[i]];
tname[i] = name[p[i]];
for(int j = 0; j < n; ++j)
tb[j][i] = b[j][p[i]];
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "BSS"))
{
if(ts[0] > 1) upd(i, 0);
else tb[i][0] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "SBS"))
{
if(ts[1] > 1) upd(i, 1);
else tb[i][1] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "SSB"))
{
if(ts[2] > 1) upd(i, 2);
else tb[i][2] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "BBS"))
{
if(ts[0] > 1) upd(i, 0);
else if(ts[1] > 1) upd(i, 1);
else tb[i][0] = tb[i][1] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "BSB"))
{
if(ts[0] > 1) upd(i, 0);
else if(ts[2] > 1) upd(i, 2);
else tb[i][0] = tb[i][2] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "SBB"))
{
if(ts[1] > 1) upd(i, 1);
else if(ts[2] > 1) upd(i, 2);
else tb[i][1] = tb[i][2] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "BBB"))
{
if(ts[0] > 1) upd(i, 0);
else if(ts[1] > 1) upd(i, 1);
else if(ts[2] > 1) upd(i, 2);
else tb[i][0] = tb[i][1] = tb[i][2] = 'S';
}
for(int i = 0; i < n; ++i)
if(equal(tb[i], "SSS"))
{
if(ts[0]) upd(i, 0);
else if(ts[1]) upd(i, 1);
else upd(i, 2);
}
for(int i = 0; i < 3; ++i)
if(ts[i] > 0) return ;
puts(ans);
exit(0);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
for(int i = 0; i < 3; ++i) scanf("%d", s+i);
scanf("%d", &n);
for(int i = 0; i < n; ++i) scanf("%s", b[i]);
p[0] = 0, p[1] = 1, p[2] = 2, solve();
p[0] = 0, p[1] = 2, p[2] = 1, solve();
p[0] = 1, p[1] = 0, p[2] = 2, solve();
p[0] = 1, p[1] = 2, p[2] = 0, solve();
p[0] = 2, p[1] = 0, p[2] = 1, solve();
p[0] = 2, p[1] = 1, p[2] = 0, solve();
puts("no solution");
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}