uva 10763 Foreign Exchange(排序+二分查找)

2023-12-19 21:08

本文主要是介绍uva 10763 Foreign Exchange(排序+二分查找),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就

想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心

了。。。看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多

三颗。。。

思路:

我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了

lower_bound,upper_bound,注释里面有写它的功能,其实这两个可以直接调用的。。。注意一下用

upper_bound的时候最后一个元素就ok啦。。。TLE其实不是我的算法的事,而是因为我把这两个函数写到循环里面

了,真傻。。。这样每次循环都会调用的。。。看网上有人说最后套数据n是小于1000的,加个if(n>1000)

for(;;;)就可以啦,哈哈,真聪明,我学会了。。。以后试着用一下。。

贴代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
struct node
{int i,j;
}a[500005];
int visit[500005];//用来标记是否已经配对过了 
int n;
int cmp(const void *a,const void *b)//结构体的二级排序 
{if(((node *)a)->i != ((node *)b)->i)return ((node *)a)->i - ((node *)b)->i;return ((node *)a)->j - ((node *)b)->j;
}
int lower_bound(int v)//二分查找,如果要查找的值存在的话,返回第一个等于该元素的位置,否则返回一个它要插入的第一个位置(序列必须先排序) 
{int m,x = 1,y = n;while(x < y ){m = x + (y-x)/2;if(a[m].i >= v) y = m ;elsex = m + 1;}return x;
} 
int upper_bound(int v)//二分查找,如果存在该元素,就返回它的下一个位置(最后一个除外,就是说如果最后一个元素等于v,就返回的是n),如果不存在,就返回它插入后仍有序的序列 
{int m;int x = 1;int y = n;while(x < y){m = x +(y -x)/2;if(a[m].i<=v) x = m+1;elsey = m;}return x;
}
int main()
{int i,j;while(cin >> n, n){memset(visit,0,sizeof(visit));for(i=1; i<=n; i++){//	cin >> a[i].i >> a[i].j;//cin输入流比较费时 scanf("%d%d",&a[i].i,&a[i].j);}qsort(a+1,n,sizeof(a[0]),cmp);//	for(i=1; i<=n; i++)//	{//cin >> a[i].i >> a[i].j;//	scanf("%d%d",&a[i].i,&a[i].j);//		cout << a[i].i << " "<< a[i].j << endl;//	}int flag1 = 0;for(i=1; i<=n; i++){if(visit[i] == 1)//配对过的不再访问 continue;int flag = 0;int first = lower_bound(a[i].j);int last = upper_bound(a[i].j);//	cout << "first = " << first << " " << last << endl;if(a[first].i != a[i].j)//没有与之配对的直接退出输出NO {flag1 =1;break;}if(last == n)//把n的情况特判一下 last ++;for(j=first; j<last; j++){if(visit[j] == 1)continue;if(a[j].j == a[i].i){visit[j] = 1;flag = 1;break;}}if(!flag){flag1 = 1;break;}visit[i] = 1;}if(flag1)cout << "NO" << endl;//	puts("NO");elsecout << "YES" << endl;//puts("YES");} return 0;
}


这篇关于uva 10763 Foreign Exchange(排序+二分查找)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/513695

相关文章

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

SQL 外键Foreign Key全解析

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo... 目录1. 什么是外键?​​ ​​​​2. 外键的语法​​​​3. 外键的约束行为​​​​4. 多列外键​