| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一次ac,要注意三个个要点(附代码,解题思路)一个是假币在不等号两边出现的次数一定等于不等式的个数,这个是显然的,否则就没有那么多不等式。第二是等号两边出现过的都是真币。第三是当所有的式子都是等式时候,要检查一下没出现在等式的硬币,如果一个没出现就是确定它是假币,否则不能确定。
#include<iostream>
using namespace std;
bool coin[100];
int Min[100];
int Max[100];
int N;
int K;
int main()
{
memset(coin,false,sizeof(bool));
memset(Min,0,sizeof(int));
memset(Max,0,sizeof(int));
cin>>N>>K;
int countNotEqual=0;
for(int i=0;i<K;i++)
{
int count=0;
cin>>count;
int record[200];
for(int j=0;j<count*2;j++)
{
cin>>record[j];
}
char oper;
cin>>oper;
if(oper=='=')
{
for(int j=0;j<count*2;j++)
coin[record[j]-1]=true;
}
else
{
countNotEqual++;
if(oper=='<')
{
for(int j=0;j<count;j++)
{
Min[record[j]-1]++;
}
for(int j=count;j<2*count;j++)
{
Max[record[j]-1]++;
}
}
else
{
for(int j=0;j<count;j++)
{
Max[record[j]-1]++;
}
for(int j=count;j<2*count;j++)
{
Min[record[j]-1]++;
}
}
}
}
bool minexit=false;
int minresult=0;
int countOfMinResult=0;
//找最小的
for(int i=0;i<N;i++)
{
if(Min[i]==countNotEqual && !coin[i])
{
if(countOfMinResult==0)//第一个结果
{
minresult=i+1;
countOfMinResult++;
minexit=true;
}
else
{
minexit=false;
break;
}
}
}
bool maxexit=false;
int maxresult=0;
int countOfMaxResult=0;
for(int i=0;i<N;i++)
{
if(Max[i]==countNotEqual && !coin[i])
{
if(countOfMaxResult==0)//第一个结果
{
maxresult=i+1;
countOfMaxResult++;
maxexit=true;
}
else
{
maxexit=false;
break;
}
}
}
int result=0;
if((minexit && maxexit) || (!minexit && !maxexit))
{
result=0;
}
else
{
if(minexit)
result=minresult;
else
result=maxresult;
}
if(result==0)
{
bool only=true;
for(int i=0;i<N;i++)
{
if(!coin[i] )
{
if(only)
{
result=i+1;
only=false;
}
else
{
result=0;
break;
}
}
}
}
cout<<result<<endl;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator