题目如下:
已知字符A.B,C。每个字符都有自己的权值q。
现不知道权值q,只知道A,B,C的三次比较结果。
输入描述:
输入三个字符串表示三次比较的结果
输出描述:
输出结果,如果不存在输出”Impossible”
输入样例:
A<B
B>C
C>A
输出样例:
ACB
思路 or 题解:
方法 一:
适用于 小数据量
分类讨论
方法 一:AC代码如下:
/*
Make it simple and keep self stupid
author:Joanh_Lan
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>
#include <cstring>
#include <cmath>
#include <map>
#include <unordered_map>
#include <bitset>
#include <set>
#include <random>
#include <ctime>
#include <queue>
#include <stack>
#include <climits>
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0);
// #define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
// int Mod(int a,int mod){return (a%mod+mod)%mod;}
// int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
// int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
// int inv(int a,int mod){return qmi(a,mod-2,mod);}
// int lcm(int a,int b){return a*b/__gcd(a,b);}
void solve()
{
map<char, int> mp;
mp['A'] = 0, mp['B'] = 0, mp['C'] = 0;
bool flag = 1;
for (int i = 1; i <= 3; i++)
{
char x, y, z;
cin >> x >> y >> z;
if (y == '<')
{
if (mp[x] > mp[z] && mp[x] && mp[z])
flag = 0;
mp[x]--, mp[z]++;
}
else
{
if (mp[x] < mp[z] && mp[x] && mp[z])
flag = 0;
mp[z]--, mp[x]++;
}
}
if (!flag)
{
cout << "Impossible\n";
return;
}
map<int,char> ans;
for (auto it : mp)
ans[it.second] = it.first;
for(auto it : ans)
cout << it.second;
}
int main()
{
buff;
int _ = 1;
// cin >> _;
while (_--)
solve();
}
方法 二:
适用于 大数据量
拓扑排序
方法 二:AC代码如下:
/*
Make it simple and keep self stupid
author:Joanh_Lan
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>
#include <cstring>
#include <cmath>
#include <map>
#include <unordered_map>
#include <bitset>
#include <set>
#include <random>
#include <ctime>
#include <queue>
#include <stack>
#include <climits>
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0);
// #define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
// int Mod(int a,int mod){return (a%mod+mod)%mod;}
// int lowbit(int x){return x&-x;}//最低位1及其后面的0构成的数值
// int qmi(int a, int k, int p){int res = 1 % p;while (k){if (k & 1) res = Mod(res * a , p);a = Mod(a * a , p);k >>= 1;}return res;}
// int inv(int a,int mod){return qmi(a,mod-2,mod);}
// int lcm(int a,int b){return a*b/__gcd(a,b);}
vector<int> g[5];
int d[5], q[5];
bool topsort()
{
int tt = -1, hh = 0;
for (int i = 0; i < 3; i++)
if (!d[i])
q[++tt] = i;
while (hh <= tt)
{
int t = q[hh++];
for (auto it : g[t])
{
d[it]--;
if (!d[it])
q[++tt] = it;
}
}
return tt == 2;
}
void solve()
{
for (int i = 1; i <= 3; i++)
{
char a, b, c;
cin >> a >> b >> c;
if (b == '>')
g[c - 'A'].push_back(a - 'A'), d[a - 'A']++;
else
g[a - 'A'].push_back(c - 'A'), d[c - 'A']++;
}
if (topsort())
for (int i = 0; i < 3; i++)
cout << char('A' + q[i]);
else
cout << "Impossible\n";
}
int main()
{
buff;
int _ = 1;
// cin >> _;
while (_--)
solve();
}
/*
A<B
B>C
C>A
*/