三角形(哈希函数)
實驗任務
給你 n 個三角形,每個三角形有一個優雅值, 然后給出一個詢問,每次詢問一個三角形, 求與詢問的三角形,相似的三角形中的優雅值最大是多少。
★數據輸入
第一行輸入包括 n 一個數字,
接下來 n 行,每行四個整數數字
a,b,c,val 表示三條邊,以及優美值
之后輸入一個數字 m
之后 m 行,每行三個數字 a,b,c,表示詢問的三角形。
★數據輸出
輸出 m 行,如果查詢的三角形不在給定的 n 個中,輸出”Sorry”,否則輸出三角 形的優美值
解題思路:對于三角形三條邊用哈希函數首先就是要找到一個函數找到key,三角形可以根據他們的gcd值來區分是否相似(還會有一些重合),對于重合情況,可以通過每一個key中設置一個鏈表,直接對比三條邊是否會相等從而得出結果。(p:我實現了好幾次還沒有過,結果出來了但是還是RE,就先講思路,貼評優同學的代碼)
代碼
#include<stdio.h> #include<algorithm> using namespace std; int fun(int a,int b) {int t;while(b){t = a%b;a = b;b = t;}return a; } struct tr {int a,b,c;int val;tr *next; }*tri[300005]; int main() {int pai[5],n,m,i,j;scanf("%d",&n);for(i=1;i<300005;i++){tri[i]=new struct tr;// tr temp=*tri[i];tri[i]->next=NULL;tri[i]->val=-0x7f;tri[i]->a=tri[i]->b=tri[i]->c=0;}for(i=1;i<=n;i++){int val;scanf("%d%d%d%d",&pai[1],&pai[2],&pai[3],&val);sort(pai+1,pai+4);int gcd=fun(fun(pai[1],pai[2]),pai[3]);pai[1]/=gcd;pai[2]/=gcd;pai[3]/=gcd;int hash=pai[1]+pai[2]+pai[3];tr *p=tri[hash];for(;;){ if(p->a==0&&p->b==0&&p->c==0){p->a=pai[1];p->b=pai[2];p->c=pai[3];p->val=val;p->next=new struct tr;p=p->next;p->a=p->b=p->c=0;p->val=-0x3f;p->next=NULL;break;}else if(p->a==pai[1]&&p->b==pai[2]&&p->c==pai[3]){p->val=val> p->val?val:p->val;break;}else p=p->next;}}scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d%d%d",&pai[1],&pai[2],&pai[3]);sort(pai+1,pai+4);int hash=0;int gcd=fun(fun(pai[1],pai[2]),pai[3]);pai[1]/=gcd;pai[2]/=gcd;pai[3]/=gcd; hash=pai[1]+pai[2]+pai[3];tr *p=tri[hash];int pan=0;for(;;){if(p->next==NULL) break;if(p->a==pai[1]&&p->b==pai[2]&&p->c==pai[3]){printf("%d\n",p->val);pan++;break;}else p=p->next; }if(pan==0) printf("Sorry\n");} }對于需要鏈表的題目,不知道有沒有同學和我一樣比較不熟悉,我覺得這份代碼在鏈表指針上的使用比較有助于對鏈表的進一步理解(謝謝澤波同學給予的幫助)。
貼上我的代碼:
#include<cstdio> #include<cstdlib> #include<algorithm> #include<iostream> using namespace std; #define Maxsize 100005 #define INF 100000000 typedef struct atri* Tri; typedef struct atri {int a[3];int val;Tri next; }Atri; //typedef struct atriList* Head; //typedef struct atriList //{ // Tri fir_tri; //};//求gcd函數 int gcd(int a, int b) {if (a<b){int tmp = a; a = b; b = tmp;}int tmp=1;while (b != 0){tmp = b;b = a%b;a = tmp;}return tmp; } void Init(Tri tris[Maxsize]) {int i;for (i = 0; i<Maxsize; i++){tris[i] = new Atri;tris[i]->a[0] = tris[i]->a[1] = tris[i]->a[2] = 0;tris[i]->next = NULL;tris[i]->val = -INF;} } Tri tris[Maxsize];int main() {int n, m, i, j;int a[3], val;int gcdof;Init(tris);scanf("%d", &n);for (i = 0; i<n; i++){scanf("%d%d%d%d", &a[0], &a[1], &a[2], &val);sort(a, a + 3);gcdof = gcd(a[0], gcd(a[1], a[2]));a[0] /= gcdof; a[1] /= gcdof; a[2] /= gcdof;Tri link = tris[a[0] + a[1] + a[2]]->next; //link代表這個key值的鏈表頭指針 int exist = 0; //設置初始該相似三角形在鏈表中不存在時為0;if (link!= NULL){while (1){if (link->a[0] == a[0] && link->a[1] == a[1] && link->a[2] == a[2]){if (link->val < val)link->val = val;exist = 1; break;}else if (link->next == NULL){Tri tmp = new Atri;tmp->a[0] = a[0]; tmp->a[1] = a[1]; tmp->a[2] = a[2];tmp->val = val; tmp->next = NULL; link->next = tmp; break;}else if (link->next != NULL){link = link->next;}}}else{Tri tmp = new Atri;tmp->a[0] = a[0]; tmp->a[1] = a[1]; tmp->a[2] = a[2];tmp->val = val; tmp->next = NULL; tris[a[0]+a[1]+a[2]]->next= tmp;}}scanf("%d", &m);for (i = 0; i<m; i++){scanf("%d%d%d", &a[0], &a[1], &a[2]);sort(a, a + 3);gcdof = gcd(a[0], gcd(a[1], a[2]));printf("%d\n",gcdof); a[0] /= gcdof; a[1] /= gcdof; a[2] /= gcdof;Tri link = tris[a[0]+a[1]+a[2]]->next; //link代表這個key值的鏈表頭指針 if (link != NULL){while (1){if (link->a[0] == a[0] && link->a[1] == a[1] && link->a[2] == a[2]){printf("%d\n", link->val);break;}else if (link->next == NULL){printf("Sorry\n"); break;}else if (link->next != NULL){link = link->next;}}}else printf("Sorry\n");}return 0; }PS:第二次實現三角形,對鏈表使用熟悉多了,三角形已經AC了,代碼已更新;
轉載于:https://www.cnblogs.com/heihuifei/p/7979231.html
總結
- 上一篇: 图片素材库
- 下一篇: jQuery的ajax的post请求js