水题  只要枚举两个水果 然后枚举两个水果各一个点 就可以构成直线 然后寻找经过直线的水果 只有一个水果的情况进行特判一下

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

struct dat
{
    int x[15];
    int y[15];
    int sum;
}a[15];
int n;
bool finds(int x1, int y1, int x2, int y2, int c)
{
    int d[2]={0};
    for(int i=0; i<a[c].sum; i++)
    {
        if((a[c].y[i]-y1)*(x1-x2)-(y1-y2)*(a[c].x[i]-x1)<0)
            d[0]++;
        else   if((a[c].y[i]-y1)*(x1-x2)-(y1-y2)*(a[c].x[i]-x1)>0)
            d[1]++;
        else
            return true;
        if(d[0] && d[1])
            return true;
    }
    return false;
}
int solve(int c, int d)
{
    int mx=-1;
    for(int i=0; i<a[c].sum; i++)
    {
        for(int j=0; j<a[d].sum; j++)
        {
            int num=0;
            for(int q=0; q<n; q++)
            {
                if(finds(a[c].x[i],a[c].y[i],a[d].x[j],a[d].y[j],q))
                    num++;
            }
            if(num>mx)
                mx=num;
            if(mx==n)
                return n;
        }
    }
    return mx;
}
int main()
{
    int t;
    int cas=0;
    scanf("%d",&t);
    while(t--)
    {
        cas++;
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i].sum);
            for(int j=0; j<a[i].sum; j++)
                scanf("%d %d",&a[i].x[j],&a[i].y[j]);
        }
        if(n<=2)
            printf("Case %d: %d\n",cas,n);
        else
        {
            int mx=-1;
            for(int i=0; i<n; i++)
            {
                for(int j=i+1; j<n; j++)
                {
                   int num=solve(i,j);
                   if(num>mx)
                    mx=num;
                    if(mx==n)
                        break;
                }
                if(mx==n)
                    break;
            }
          printf("Case %d: %d\n",cas,mx);
        }
    }
    return 0;
}
View Code

 

 

posted on 2013-08-16 18:55  风流monkey  阅读(163)  评论(0编辑  收藏  举报