sgsgsgsgsg___ 2021-06-01 20:48 采纳率: 33.3%
浏览 38
已采纳

请教各位大神,我的代码带入例子结果是正确的,但总是超时,请问还有什么措施可以减少用时?

给一些散点,找出可以构成平行四边形的数量(需排除四点共线情况,所给点可能有重复)代码内容如下:

#include<iostream>
#include<cstring>
using namespace std;
#define NL 1601
#define MD 119997
int hash1[MD];
struct POINT {
    int x, y;
}p[NL];
struct MIDDLE{
    POINT P,A,B;
}mid[MD];

void hashing(int k) {          
    int key=(((mid[k].P.x)*1000+(mid[k].P.y)*1234)%MD+MD)%MD;
    while (hash1[key] >=0) key = (key + 1) % MD;
    hash1[key] = k;
}

int searching(MIDDLE po) {        
    int key=(((po.P.x)*1000+(po.P.y)*1234)%MD+MD)%MD;
    int sign=0;
    while (hash1[key] >=0) {
         int T = hash1[key];
         if (mid[T].P.x == po.P.x && mid[T].P.y == po.P.y){
             if((mid[T].A.x!=po.A.x||mid[T].A.y!=po.A.y)&&(mid[T].A.x!=po.A.x||mid[T].A.y!=po.A.y)){
                 if((mid[T].A.y-mid[T].B.y)*(mid[T].A.x-po.A.x)!=(mid[T].A.x-mid[T].B.x)*(mid[T].A.y-po.A.y)){
                 sign++;}}}
         key = (key + 1) % MD;
    }
    return sign;
}

int M[400]={0};
int main(){
    int n,m,a,b;
    cin>>n;
    if(n>100){
        return 0;}
    for(int i=0;i<n;i++){
        memset(hash1,-1,MD);
        cin>>m;
        if(m>400){
            return 0;}
        int sum=0;
        for(int j=0;j<m;j++){
            cin>>a;
            cin>>b;
            p[j].x=a;
            p[j].y=b;}
        int num=1;
        for(int r=0;r<m;r++){
            for(int s=r+1;s<m;s++){
                mid[num].P.x=p[r].x + p[s].x;
                mid[num].P.y=p[r].y + p[s].y;
                mid[num].A.y = p[r].y; mid[num].A.x = p[r].x;
                mid[num].B.y = p[s].y; mid[num].B.x = p[s].x;
                hashing(num);
                sum+=searching(mid[num]);
                num++;}}
        M[i]=sum;}
    for(int i=0;i<n;i++){
        cout<<M[i]<<endl;}
    return 0;}

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-06-01 22:22
    关注

    可以搜一下N个数中取n个数的全排列实现算法,然后改进一下。本例中for循环嵌套的话需要四层嵌套,如下:

    for(int a=0;a<N;a++){ 
    for(int b=a+1;b<N;b++){
    for(int c=b+1;c<N;c++){
    for(int d=c+1;d<N;d++){

    //四个点就是P[a]、P[b]、P[c]、P[d]

    //判断这四个点能不能构成平行四边形jiuk就可以了

    }} } }

    其中N是点的个数。

    如有帮助,请给个采纳,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来