#include<iostream>
#include<vector>
#include<unordered_set>
#include<algorithm>
using namespace std;
int main(){
int n,temp,m,_1,_2,num=0,temp1;
scanf("%d",&n);
unordered_set<int> v[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&temp);
for(int j=0;j<temp;j++){
cin>>temp1;
v[i].insert(temp1);
}
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d %d",&_1,&_2);
num=0;//num忘记条件重置(注意) 上面涉及的所有东西都要条件重置 ,而且位置要在处理完整个问题之后
int k=v[_2].size();
yu.clear();
for( auto it=v[_1].begin();it!=v[_1].end();it++){
if(v[_2].find( *it)!=v[_2].end() ){
num++;
//条件重置
}
else
k++;
}double ans=(num*1.0/k)*100;
printf("%.1lf%\n",ans);
}
return 0;
}
总结
1.本来用的方法特别麻烦,又求快导致有一些对题目的理解不充分
2.当我改完,以前的方法已经删了,导致不能找以前的错误,这点以后要注意
3.如果能用现有的东西解决的,尽量不要再弄一个别的东西代替,容易出问题
3.如果必须用到vector的find则只能用algorithm的find(起,终,查找元素)
4.本题根本用不到重复元素,看看能不能先把数据处理一下,需不需要重复元素,数的话直接set去掉另外注意这种用法vector<set<int>> mm;
如果是字符串那只能用一个set来控制不重复输入或者计数
5.不要用num[i]++,因为num后续的还要使用不能改变应该引一个参数
别光图省事,是不是需要引参数,
当多组query重复检测时先明确哪些需要条件重置(一般是存放结果或辅助的出结果的),哪些自己本身不能变(一般是那些一开始整理的通用信息)
4.这道题给我最大的经验是 东西越简单,越可靠!
英语
问题 如何避免5中的错误 写注释将下面用到的信息用不同的标记分类
通用 辅助 +结果