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


#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; }