思路:
最开始想模拟分类,逐个赋值重量,最后重量不同的硬币是错误的硬币。
后面看题解发现,直接比较次数是正解。
即:
- 假币在<或>式子中出现的次数等于 不等式出现的次数。因为只要有假币,那么就肯定不等
- 相等时,一定无假币
- 如果发现多个假币,说明假币可能为0.(第一次提交错在这)
#include<iostream>
using namespace std;
const int maxn = 1009;
int n,k;
int un_l[maxn];
int un_r[maxn];
bool tru[maxn];
int un_num;
void put_l_or_r(int *un,int ch[],int p){
for(int i = 0;i < p;i++){
un[ch[i]]++;
}
}
void c_l_r(char symbol,int lc[],int rc[],int p){
if(symbol != '='){
un_num++;
if(symbol == '<'){
put_l_or_r(un_l,lc,p);
put_l_or_r(un_r,rc,p);
}else{
put_l_or_r(un_r,lc,p);
put_l_or_r(un_l,rc,p);
}
}else{
for(int i = 0;i < p;i++){
tru[lc[i]] = 1;
tru[rc[i]] = 1;
}
}
}
void putt(int a[],int p){
for(int i = 0;i < p;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void puttf(bool a[],int p){
for(int i = 0;i < p;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void read(){
scanf("%d%d",&n,&k);
for(int i = 0;i < k;i++){
int p;
int lc[509];
int rc[509];
char symbol;
scanf("%d",&p);
for(int j = 0;j < p;j++){
scanf("%d",&lc[j]);
}
for(int j = 0;j < p;j++){
scanf("%d",&rc[j]);
}
getchar();
scanf("%c",&symbol);
// putt(lc,p);
// putt(rc,p);
// cout<<symbol<<endl;
c_l_r(symbol,lc,rc,p);
}
// puttf(tru,n+1);
int con = 0;
int i_i = 0;
for(int i = 1;i<=n;i++){
if(tru[i] == 0&&(un_l[i] == un_num || un_r[i] == un_num ) ){
con++;
i_i = i;
}
}
if(con==1){
cout<<i_i;
}else{
cout<<0;
}
}
int main()
{
read();
return 0;
}
/*
5 3
2 1 2 3 4
<
1 1 4
=
1 2 5
=
*/