Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

郁闷啊,过遍所有数据还是一直哇哇叫,帮我看看思路

Posted by sjgg at 2009-12-26 15:47:34 on Problem 1029
想法很简单啊
就是
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator