| ||||||||||
| 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 | |||||||||
郁闷啊,过遍所有数据还是一直哇哇叫,帮我看看思路想法很简单啊
就是
0.先T除所有等号里出现的数据
目标就在剩下的元素里
然后看大于小于号里的数据(已经T除=号里的数据)
1.找到在所有小于号或者大于号左边出现的数字
就是不等式左边的公共数字,个数几位n1
2.找到在所有小于号或者大于号右边出现的数字
就是不等式左边的公共数字,个数几位n2
3.如果n1==1 n2==0则就是不等式左边的那个公共数字啊
如果n2==1 n1==0则就是不等式右边的那个公共数字啊
4.其他情况是0
试过讨论所有测试数据就是出错,郁闷啊
贴上代码了啊
/*POJ1029-False Coin
Author: sjgg
Date: Dec-25-2009
*/
#include <stdio.h>
int main()
{
int n,k;
int i,j;
char s[100];
int nums[100];
int arr[100][1000];
int is_in_ne[100]={0};
int is_in_ne1[100]={0};
int false_index;
int false_index1,false_index2;
int count=0;
int num_ne=0;
int common_nums1=0,common_nums2=0;
int num_of_greater=0;
int num_of_smaller=0;
scanf("%d%d",&n,&k);
for(i=0;i<k;i++)
{
scanf("%d",&nums[i]);
for(j=0;j<nums[i]*2;j++)
scanf("%d",&arr[i][j]);
while(1)
{
s[i]=getchar();
if(s[i]=='=' || s[i]=='<' || s[i]=='>')
break;
}
}
//如果只有两个coin,则不能判断
if(n==2)
{
false_index=0;
printf("%d",false_index);
return 0;
}
//如果有大有小则不能判断
for(i=0;i<k;i++)
{
if(s[i]=='<')
num_of_smaller++;
else if(s[i]=='>')
num_of_greater++;
}
if(num_of_greater>0 && num_of_smaller>0)
{
false_index=0;
printf("%d",false_index);
return 0;
}
for(i=0;i<k;i++)
if(s[i]=='<' || s[i]=='>')
break;
//如果都是都是等号去除等号元素,如剩下一个则找到
if(i==k)
{
for(i=0;i<k;i++)
if(s[i]=='=')
{
for(j=0;j<nums[i]*2;j++)
{
is_in_ne[arr[i][j]-1]=2;
}
}
for(i=0;i<n;i++)
if(is_in_ne[i]==0)
{
count++;
false_index=i+1;
}
if(count!=1)
false_index=0;
printf("%d",false_index);
return 0;
}
//如果存在大于小于号去除等号数字
for(i=0;i<k;i++)
if(s[i]=='=')
{
for(j=0;j<nums[i]*2;j++)
{
is_in_ne[arr[i][j]-1]=-1;
}
}
for(i=0;i<k;i++)
is_in_ne1[i]=is_in_ne[i];
//
num_ne=num_of_smaller+num_of_greater;
//如果有不等号存在则表上不等号数
for(i=0;i<k;i++)
if(s[i]=='<' || s[i]=='>')
{
for(j=0;j<nums[i];j++)
{
if(is_in_ne[arr[i][j]-1]!=-1)
is_in_ne[arr[i][j]-1]++;
}
for(j=nums[i];j<nums[i]*2;j++)
{
if(is_in_ne[arr[i][j]-1]!=-1)
is_in_ne1[arr[i][j]-1]++;
}
}
//找到公共不等数的个数
for(i=0;i<n;i++)
{
if(is_in_ne[i]==num_ne)
{
common_nums1++;
false_index1=i+1;
}
if(is_in_ne1[i]==num_ne)
{
common_nums2++;
false_index2=i+1;
}
}
//只有一个公共不等数,则找到
if(common_nums1==1 && common_nums2==0)
{
printf("%d",false_index1);
return 0;
}
if(common_nums2==1 && common_nums1==0)
{
printf("%d",false_index2);
return 0;
}
else
{
false_index=0;
printf("%d",false_index);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator