1800: [Ahoi2009]fly 飞行棋

来源:互联网 发布:淘宝秒杀是真的假的 编辑:程序博客网 时间:2024/06/05 20:07
1800: [Ahoi2009]fly 飞行棋

 

Description

给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。

Input

第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

Output

所构成不重复矩形的个数

Sample Input

8
1
2
2
3
1
1
3
3


Sample Output

3

HINT

N<= 20

Source

 

这道题还是挺水的 想要构成矩形 那么对角线一定是圆的直径  

找到所有圆的直径 判断两组点是否构成矩形 (好像这里是组合数???)

 

 

 1 #include <cstdio> 2 #include <cctype> 3 #include <cstring> 4  5 const int INF=0x3f3f3f3f; 6 const int MAXN=110; 7  8 int n,c,tot,ans; 9 10 int map[MAXN][MAXN],Sx[MAXN],Sy[MAXN];11 12 inline void read(int&x) {13     int f=1;register char c=getchar();14     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());15     for(;isdigit(c);x=x*10+c-48,c=getchar());16     x=x*f;17 }18 19 inline int min(int a,int b) {return a<b?a:b;}20 21 inline void DFS() {22     for(int i=1;i<=tot;++i) 23       for(int j=1;j<=tot;++j) {24           if(i==j) continue;25           int x1=Sx[i],y1=Sy[i];26           int x2=Sx[j],y2=Sy[j];27           if(map[x1][x2]==map[y1][y2]&&map[x2][y1]==map[x1][y2]) ++ans;28       }29 }30 31 int hh() {32     freopen("A.in","r",stdin);33     freopen("A.out","w",stdout);34     read(n);35     memset(map,INF,sizeof map);36     for(int i=1;i<n;++i) read(map[i][i+1]),c+=map[i][i+1],map[i+1][i]=map[i][i+1];37     read(map[n][1]),map[1][n]=map[n][1];38     c+=map[n][1];39     for(int k=1;k<=n;++k)40       for(int i=1;i<=n;++i)41         for(int j=1;j<=n;++j)42           map[i][j]=min(map[i][j],map[i][k]+map[k][j]);43     for(int i=1;i<=n;++i)44       for(int j=1;j<=n;++j)45           if(map[i][j]==c/2) {46               Sx[++tot]=i,Sy[tot]=j;47               break;48         }49     tot/=2;50     DFS();51     printf("%d\n",ans/2);52     fclose(stdin);53     fclose(stdout);54     return 0;55 }56 57 int sb=hh();58 int main(int argc,char**argv) {;}
代码

 

原创粉丝点击