写的时候心情很焦躁,导致没分析样例就急着做题,结果浪费一堆时间
思路:
参考紫书的发送邮件的题目,设置了map<int,vector<int> >来存储每个坐标在first的学生,两层for循环求解从原地出发去的学校的人数与目的地来原地的人数是否相等即可
优化思路:
参考图的数据结构,直接利用map<int,int>记录来此学校的人数与离开此学校的人数是否相等即可,离开-1,来+1,最后结果应该全为0
代码是按我自己的思路写的
1 #include <bits/stdc++.h> 2 using namespace std;//别急 3 map<int,vector<int> > m;//易错:cnt2的初始值不应该设置为0 2.认真读题,数字是学校,是允许重复的 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)&&n){//清空! 8 m.clear(); 9 bool flag = true; 10 while(n--){ 11 int x,y; 12 scanf("%d%d",&x,&y); 13 if(m.count(x)) m[x].push_back(y); 14 else{ 15 vector<int> v; 16 v.push_back(y); 17 m.insert(make_pair(x,v)); 18 } 19 } 20 for(auto it=m.begin();it!=m.end()&&flag;it++){ 21 int x = it->first; 22 for(int i=0;i<m[x].size();i++){ 23 int cnt = count(m[x].begin(),m[x].end(),m[x][i]);int cnt2 = 1<<31; 24 if(m.count(m[x][i])){ 25 cnt2 = count(m[m[x][i]].begin(),m[m[x][i]].end(),x); 26 } 27 if(cnt2!=cnt) {printf("NO\n");flag = false; break; } 28 } 29 } 30 if(flag) printf("YES\n"); 31 } 32 return 0;//养成习惯 33 }
题后总结:
- 全局变量一定要清零
- 局部变量的初值