当前位置: 首页 > news >正文

UVA - 10763 Foreign Exchange

//这题虽然不算难题,而且因为还没学图论,不知道无向图是什么,所以查题解磕磕碰碰地完成了,过程可谓是一波三折,不过也算收获良多


/*
  法一:
  参考blog1: http://blog.csdn.net/shihongliang1993/article/details/73500018
  这个博主用了许多C++11的新特性,看得我大开眼界,将他用到的几种新用法弄明白,都用了不少的时间,不过也非常值得
  
  1. unordered_map 和 unordered_set
  有关博客:
  http://blog.csdn.net/liuhongxiangm/article/details/17395831
  http://blog.csdn.net/vevenlcf/article/details/51743058
  
  以及,默认情况下unordered_map只支持primitive type作为其key,若使用用户自定义的key,需要传入用户自定义的hash function,见博客:
  http://blog.csdn.net/missshirly/article/details/51231836
  
  
  特别要注意的一点是:在unordered_map的key为自定义类型时,必须重载 == 或 (),见:
  https://www.zhihu.com/question/30921173
  
  2. auto变量的使用,主要出现在:
  auto h1 = std::hash<T1>{}(p.first);
  和  for(auto &p:dic)if(p.second!=0){flag=0;break;}
  
  有关博客:
  http://blog.csdn.net/yhl_leo/article/details/50864612
  http://blog.csdn.net/huang_xw/article/details/8760403
  
  
  3. using的使用, using 和 typedef 的区别
  见:https://www.zhihu.com/question/25102205
  一句话概括:using 可以用于模板别名,typedef 不可用于模板别名
  
  
  4. 再次再次强调:
  对于map,在使用map[key]前,必须先检查一下key是否存在
  如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null
  (这个笔记是之前做题时就写下的,然而今天居然又忘记了...)
  
  
  5.C++11中,for循环的新用法:
  
    int main()
	{
		std::vector<int> arr;
		arr.push_back(1);
		arr.push_back(2);

		for (auto n : arr)
		{
			std::cout << n << std::endl;
		}

		return 0;
	}
	
	另外,上述方式是只读,如果需要修改arr里边的值,可以使用for(auto& n:arr)
	for循环的这种使用方式的内在实现实际上还是借助迭代器的,所以如果在循环的过程中对arr进行了增加和删除操作,那么程序将对出现意想不到的错误。

	见博客: http://www.cnblogs.com/jiayayao/p/6138974.html
	
   *****注意!!!!这个博主的代码,采用了C++11标准,如果不做一些改动,是不能在DevC下成功编译的,而要做的改动见下:
  
  贴吧地址:http://tieba.baidu.com/p/2933212687 (如果贴吧失效了,可以看下面的说明)
  a. 首先保证 gcc 版本 >= 4.8.1(只有 4.8.1 及以上的版本才能完全支持 C++11)
  b. 如果第1个条件能保证,那么就要对 DEV-C++ 设置了,具体步骤如下:
  工具 -> 编译器选项->程序(将 g++ 修改为 g++ -std=c++11 )
  
  如果是其他的编译器,报编译错时,也应该搜索下,这个编译器怎样设置,才能采用C++11的标准来编译
  例如:我当时试了各种搜索的关键词搭配,最后发现,搜索"devc++ c11标准"才得到了设置方法 T^T
  
*/
#include <iostream>
#include <unordered_map>
using namespace std;
struct pair_hash
{
	template <class T1, class T2>
	size_t operator () (const pair<T1, T2> &p) const
	{
		auto h1 = hash<T1>{}(p.first);
		auto h2 = hash<T2>{}(p.second);
		return h1 ^ h2;
	}
};

using Vote = pair<int, int>;
using Unordered_map = unordered_map<Vote, int, pair_hash>;

int main()
{
	int n, a, b;
	while (cin >> n && n)
	{
		Unordered_map dic;
		for (int i = 0; i < n; i++)
		{
			cin >> a >> b;
			auto p = make_pair(a, b), q = make_pair(b, a);
			if (dic.find(p) != dic.end()) dic[p]++;
			else if (dic.find(q) != dic.end()) dic[q]--;
			else dic[p] = 1;
		}
		int flag = 1;
		for (auto &p: dic)
		if (p.second != 0)
		{
			flag = 0;
			break;
		}
		cout << (flag ? "YES" : "NO") << endl;
	}
	
	return 0;
}


/*
  法二:
  这个方法采用的是邻接矩阵的思路,虽然还没学到数据结构,但是看到这个博主的代码,却也不由感慨...唉,他怎么就能想到这么简单优雅的做法呢!~连我这样还没学数据结构的人,都觉得他的方法实在是...太好了!
  
  博客:http://blog.csdn.net/monkeyduck/article/details/16335485
*/


#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1005;
int map[maxn][maxn];
bool is_ok()
{
	for (int i = 0; i < maxn; i++)
	for (int j = 0; j < maxn; j++)
	{
		if (map[i][j] != 0)
		return 0;
	}
	return 1;
}

int main()
{
	cin.tie(0);
	cin.sync_with_stdio(false);
	
	int n, a, b;
	while (cin >> n && n)
	{
		memset(map, 0, sizeof(map));
		
		for (int i = 0; i < n; i++) 
		{
			cin >> a >> b;
			map[a][b]++;
			map[b][a]--;
		}
		
		if (n % 2)
		{
			cout << "NO" << endl;
			continue;
		}
		
		if ( is_ok() ) cout << "YES" << endl;
		else cout << "NO" << endl;
		
	}
	return 0;



/*法三:
  这个博主的思路是:
  定义node结构体,并用它建立两个数组
  对于n个学生,每次输入a、b,将(a, b)存入第一个数组,(b, a)存入第二个数组
  
  如果恰好满足交换条件,那么这两个数组,按照同样的排序标准,经过排序后,应该是完全相同的
  
  思路借鉴自博客:
  http://blog.csdn.net/keshuai19940722/article/details/10201143
  
  法三和之前做过的一道题有些像,虽然那题是映射的思路,但两者的思路上有些相通之处,附上题号和地址,一起复习效果更佳:
  UVA - 1339 Ancient Cipher
  http://blog.csdn.net/mofushaohua_ln/article/details/77487633
*/

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 5e5 + 100;

struct node
{
	int x, y;
	bool operator < (const node& a) const
	{
		if (x != a.x) return x < a.x;
		if (y != a.y) return y < a.y;
		return false;
	}
} tep[maxn], cur[maxn];  // temp, current

int main()
{
	cin.tie(0);
	cin.sync_with_stdio(false);
	
	int n;
	while (cin >> n && n)
	{
		memset(tep, 0, sizeof(tep));
		memset(cur, 0, sizeof(cur));
		for (int i = 0; i < n; i++)
		{
			cin >> tep[i].x >> tep[i].y;
			cur[i].x = tep[i].y;
			cur[i].y = tep[i].x;
		}
		
		sort(tep, tep + n);
		sort(cur, cur + n);
		
		int flag = 1;
		for (int i = 0; i < n; i++)
		if (tep[i].x != cur[i].x || tep[i].y != cur[i].y)
		{
			flag = 0; break;
		}
		if (flag) cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	
	return 0;
}



转载于:https://www.cnblogs.com/mofushaohua/p/7789427.html

相关文章:

  • 网络编程概述和三要素(IP/端口号/协议)以及Socket通信原理
  • 张春晖让视频的每词每句都可搜索:Autotiming 可以自动配字幕,还将改变哪些领域?...
  • 寄存器调试 (1):应用层基于shell命令访问
  • 谱聚类实例
  • postgresql update returning
  • 其实吧,360的开发,素质也没高到哪去,看代码就看出来了
  • 判断js数据类型
  • Linux上给不是管理员的用户增加安装软件的权限
  • 【已解决】项目加载失败,Web应用程序项目XX已配置为使用IIS
  • JDBC连接数据库:单线程、多线程、批处理插入数据的对比
  • VS2015 +EF6 连接MYSQL数据库生成实体
  • CF 840 D
  • 初识oracle存储过程
  • 大数据竞赛平台Kaggle案例实战
  • 我的Hibernate学习记录(一)
  • 收藏网友的 源程序下载网
  • exports和module.exports
  • javascript面向对象之创建对象
  • Java-详解HashMap
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • win10下安装mysql5.7
  • 初识MongoDB分片
  • 聊聊directory traversal attack
  • 爬虫模拟登陆 SegmentFault
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .Net 4.0并行库实用性演练
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 后台导出excel ,word
  • .NET序列化 serializable,反序列化
  • /proc/vmstat 详解
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [2]十道算法题【Java实现】
  • [4.9福建四校联考]
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C]整形提升(转载)
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [ffmpeg] av_opt_set 解析
  • [HTML]Web前端开发技术18(HTML5、CSS3、JavaScript )HTML5 基础与CSS3 应用——喵喵画网页
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明
  • [IE技巧] IE 中打开Office文件的设置
  • [IOI2018] werewolf 狼人
  • [LeetCode] 196. 删除重复的电子邮箱
  • [loj#115] 无源汇有上下界可行流 网络流
  • [ORM]register db Ping `default`, Error 1130: Host '' is not allow connect to this MySQL server
  • [Python] 递归返回值 为 None 的问题
  • [Valkyrie网络测试仪-软件使用技巧] - Scheduler动作录制,定制打流过程(中途启停/调整带宽/使能部分流量)