我还是个大一上的新生,不会set那些,
原本的办法粗糙的很,所以一直超时,改了算法后好多了,
我想以后学多了,这题应该会很简单;
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b){
return a>b;
}
int *at[51];
int main(){
int b,c;
scanf("%d",&b);
for(int i=1;i<=b;i++){
scanf("%d",&c);
at[i]=(int *)malloc((c+1)*sizeof(int));
at[i][0]=c;
for(int t=1;t<=at[i][0];t++)
scanf("%d",&at[i][t]);
int d=0,y=1;
sort(&at[i][1],&at[i][1]+at[i][0],cmp);
while(y<at[i][0]){
if(at[i][y]==at[i][y+1]){
at[i][y+1]=-1;
d++;
int u=y+2;
while(at[i][u]==at[i][y]&&u<=at[i][0]){
at[i][u++]=-1;
d++;
}
y=u;
}
else y++;
}
sort(&at[i][1],&at[i][1]+at[i][0],cmp);
at[i][0]-=d;
}
scanf("%d",&c);
while(c--){
int y,u,er=0,i=1,t=1;
scanf("%d%d",&y,&u);
while(i<=at[y][0]&&t<=at[u][0]){
if(at[y][i]==at[u][t]){
i++;
t++;
er++;
}
else if(at[y][i]>at[u][t]) i++;
else t++;
}
printf("%.2lf%%\n",(double)er/(at[u][0]+at[y][0]-er)*100);
}
for(int i=1;i<=b;i++)
free(at[i]);
}