《算法竞赛进阶指南》0.5排序

103. 电影

莫斯科正在举办一个大型国际会议,有n个来自不同国家的科学家参会。

每个科学家都只懂得一种语言。

为了方便起见,我们把世界上的所有语言用1到109之间的整数编号。

在会议结束后,所有的科学家决定一起去看场电影放松一下。

他们去的电影院里一共有m部电影正在上映,每部电影的语音和字幕都采用不同的语言。

对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。

现在科学家们决定大家看同一场电影。

请你帮忙选择一部电影,可以让观影很开心的人最多。

如果有多部电影满足条件,则在这些电影中挑选观影比较开心的人最多的那一部。

输入格式
第一行输入一个整数n,代表科学家的数量。
第二行输入n个整数a1,a2…an,其中ai表示第i个科学家懂得的语言的编号。
第三行输入一个整数m,代表电影的数量。
第四行输入m个整数b1,b2…bm,其中bi表示第i部电影的语音采用的语言的编号。
第五行输入m个整数c1,c2…cm,其中ci表示第i部电影的字幕采用的语言的编号。
请注意对于同一部电影来说,bi≠ci。
同一行内数字用空格隔开。

输出格式
输出一个整数,代表最终选择的电影的编号。
如果答案不唯一,输出任意一个均可。

数据范围
1≤n,m≤200000,
1≤ai,bi,ci≤109

输入样例:
3
2 3 2
2
3 2
2 3

输出样例:
2

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 200010;
int n, m, a[N], x[N], y[N], cinema[N*3], tot = 0, k, ans[N*3];int find(int f)
{return lower_bound(cinema + 1, cinema + k + 1, f) - cinema; // 返回找到的对应下标
}int main()
{cin >> n;for(int i = 1; i <= n; i++){cin >> a[i]; //n个整数a1,a2…an,其中ai表示第i个科学家懂得的语言的编号。cinema[++tot] = a[i];}cin >> m;for(int i = 1; i <= m; i++){cin >> x[i];cinema[++tot] = x[i];}for(int i = 1;i <= m; i++){cin >> y[i];cinema[++tot] = y[i];}//下面步骤为离散化sort(cinema + 1, cinema + tot + 1);k = unique(cinema + 1, cinema + tot + 1) - (cinema + 1);memset(ans, 0, sizeof(ans)); // 初始化ans 为0for(int i = 1; i <=n; i++) ans[find(a[i])]++; //第i个科学家懂得的语言的编号int ans0 = 1, ans1 = 0, ans2 = 0;for(int i = 1; i <=m; i++) //从1 到 m{int ansx = ans[find(x[i])], ansy = ans[find(y[i])];if(ansx > ans1 || (ansx == ans1 && ansy > ans2)){ans0 = i;ans1 = ansx;ans2 = ansy;}}cout << ans0 <<endl;// cout << ans1 <<endl;// cout << ans2 <<endl;return 0;
}

104. 货仓选址

在一条数轴上有 N 家商店,它们的坐标分别为 A1~AN。

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

输入格式
第一行输入整数N。
第二行N个整数A1~AN。

输出格式
输出一个整数,表示距离之和的最小值。

数据范围
1≤N≤100000

输入样例:
4
6 2 9 1

输出样例:
12

#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;
int n, a[N];int main()
{cin >> n;for(int i = 1; i <= n; i++) cin >> a[i];sort(a + 1, a + n + 1); //排序int ans = 0;int zw = a[n/2 + 1];for(int i = 1; i <= n; i++)ans += abs(a[i] - zw);cout << ans <<endl;return 0;
}

105. 七夕祭

七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。

于是TYVJ今年举办了一次线下七夕祭。

Vani同学今年成功邀请到了cl同学陪他来共度七夕,于是他们决定去TYVJ七夕祭游玩。

TYVJ七夕祭和11区的夏祭的形式很像。

矩形的祭典会场由N排M列共计N×M个摊点组成。

虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。

Vani预先联系了七夕祭的负责人zhq,希望能够通过恰当地布置会场,使得各行中cl感兴趣的摊点数一样多,并且各列中cl感兴趣的摊点数也一样多。

不过zhq告诉Vani,摊点已经随意布置完毕了,如果想满足cl的要求,唯一的调整方式就是交换两个相邻的摊点。

两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。

由于zhq率领的TYVJ开发小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。

现在Vani想知道他的两个要求最多能满足多少个。

在此前提下,至少需要交换多少次摊点。

输入格式
第一行包含三个整数N和M和T,T表示cl对多少个摊点感兴趣。
接下来T行,每行两个整数x, y,表示cl对处在第x行第y列的摊点感兴趣。

输出格式
首先输出一个字符串。
如果能满足Vani的全部两个要求,输出both;
如果通过调整只能使得各行中cl感兴趣的摊点数一样多,输出row;
如果只能使各列中cl感兴趣的摊点数一样多,输出column;
如果均不能满足,输出impossible。
如果输出的字符串不是impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。

数据范围
1≤N,M≤100000,
0≤T≤min(N∗M,100000),
1≤x≤N,
1≤y≤M

输入样例:
2 3 4
1 3
2 1
2 2
2 3

输出样例:
row 1

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;const int N = 100010;
int n, m, t, x[N], y[N], a[N], s[N];int main()
{cin >> n >> m >> t;for(int i = 1; i <= t; i++) cin >> x[i] >> y[i];bool row = !(t % n), col = !(t % m);if(row){if(col) cout << "both ";else cout << "row ";}else{if(col) cout << "column ";else {cout << "impossible" << endl;return 0;}}long long ans = 0;// 这里必须得long long,不然 溢出 T.Tif(row){int num = t / n;memset(a, 0, sizeof(a));for(int i = 1; i <= t; i++) a[x[i]]++;for(int i = 1; i <= n; i++) a[i] -= num; //每个人的纸牌都减去t / ns[0] = 0;//求前缀和for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i]; //动态规划的思想求前缀和sort(s + 1, s + n + 1);//"转换为货仓选址问题"for(int i = 1; i <=n; i++) ans += abs(s[i] - s[(n + 1) >> 1] ); //求中位数 s [(n+1) >> 1] 或者 s[n/2 + 1]}if(col){int num = t / m;memset(a, 0, sizeof(a));for(int i = 1; i <= t; i++) a[y[i]]++;for(int i = 1; i <= m; i++) a[i] -= num;s[0] = 0;for(int i = 1; i <= m; i++) s[i] = s[i - 1] + a[i];sort(s + 1, s + m + 1);for(int i = 1; i <= m; i++) ans += abs(s[i] - s[(m + 1) >> 1] );// for (int i = 1; i <= m / 2; i++) ans += s[m-i+1] - s[i];}cout << ans << endl;return 0;}

106. 动态中位数

依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。

输入格式
第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集。

每个数据集的第一行首先输入一个代表数据集的编号的整数。

然后输入一个整数M,代表数据集中包含数据的个数,M一定为奇数,数据之间用空格隔开。

数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开。

输出格式
对于每个数据集,第一行输出两个整数,分别代表数据集的编号以及输出中位数的个数(应为数据个数加一的二分之一),数据之间用空格隔开。

数据集的剩余行由输出的中位数构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开。

输出中不应该存在空行。

数据范围
1≤P≤1000,
1≤M≤9999

输入样例:
3
1 9
1 2 3 4 5 6 7 8 9
2 9
9 8 7 6 5 4 3 2 1
3 23
23 41 13 22 -3 24 -31 -11 -8 -7
3 5 103 211 -311 -45 -67 -73 -81 -99
-33 24 56

输出样例:
1 5
1 2 3 4 5
2 5
9 8 7 6 5
3 12
23 23 22 22 13 3 5 5 3 -3
-7 -3

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>using namespace std;const int N = 10010;int main()
{int t;cin >> t;while(t--){int x, m;cin >> x >> m;cout << x << " " << (m+1)/2 <<endl;priority_queue<int> max_heap; //大根堆priority_queue<int,vector<int>,greater<int>> min_heap; //小根堆int cnt = 0;for(int i = 1; i <= m; i++){int now;cin >> now;if(min_heap.empty())min_heap.push(now);else{if(now > min_heap.top()) min_heap.push(now);else max_heap.push(now);while(min_heap.size() < max_heap.size()){min_heap.push(max_heap.top());max_heap.pop();}while(min_heap.size() > max_heap.size() + 1){max_heap.push(min_heap.top());min_heap.pop();}}if(i & 1) //奇数输出{++cnt;cout << min_heap.top() <<" ";if(cnt % 10 == 0) puts(""); // 输出换行,每行包含10个数据}}puts(""); //输入完数据换行}return 0;
} 

107. 超快速排序

在这个问题中,您必须分析特定的排序算法----超快速排序。

该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序。

对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9。

您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。

输入格式
输入包括一些测试用例。
每个测试用例的第一行输入整数n,代表该用例中输入序列的长度。
接下来n行每行输入一个整数ai,代表用例中输入序列的具体数据,第i行的数据代表序列中第i个数。
当输入用例中包含的输入序列长度为0时,输入终止,该序列无需处理。

输出格式
对于每个需要处理的输入序列,输出一个整数op,代表对给定输入序列进行排序所需的最小交换操作数,每个整数占一行。

数据范围
0≤N<500000,
0≤ai≤999999999

输入样例:
5
9
1
0
5
4
3
1
2
3
0

输出样例:
6
0

#include <iostream>
#include <algorithm>
#include <cstring>#define ll long longusing namespace std;
const int N = 500010;
ll n, a[N], b[N];
ll ans;void merge(int l, int mid, int r)
{if(l == r) return; //只剩一个数,返回merge(l, l + mid >> 1, mid);merge(mid + 1, mid + 1 + r >> 1, r);int i = l, j = mid + 1; //分成左右两边for(int k = l; k <= r; k++){if(j > r || (i <= mid && a[i] <= a[j])) b[k] = a[i++]; //j > r 表示只剩左边,或者,两边都有比较a[i]和a[j] 较小的入列else{b[k] = a[j++];ans += mid - i + 1;}}for(int k = l; k <= r; k++) a[k] = b[k]; // 把临时存放数组b的放回a数组
}void q_sort()
{for(int i = 1; i <= n; i++) cin >> a[i];ans = 0;merge(1, (1 + n) >> 1, n);cout << ans << endl;
}int main()
{while(cin >> n && n) q_sort();return 0;
}

108. 奇数码问题

你一定玩过八数码游戏,它实际上是在一个3×3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3×3的网格中。

例如:

5 2 8
1 3 _
4 6 7

在游戏过程中,可以把空格与其上、下、左、右四个方向之一的数字交换(如果存在)。

例如在上例中,空格可与左、上、下面的数字交换,分别变成:

5 2 8   5 2    5 2 8
1
3   1 3 8   1 3 7
4 6 7   4 6 7   4 6 _

奇数码游戏是它的一个扩展,在一个n×n的网格中进行,其中n为奇数,1个空格和1~n2−1这n2−1个数恰好不重不漏地分布在n×n的网格中。

空格移动的规则与八数码游戏相同,实际上,八数码就是一个n=3的奇数码游戏。

现在给定两个奇数码游戏的局面,请判断是否存在一种移动空格的方式,使得其中一个局面可以变化到另一个局面。

输入格式
多组数据,对于每组数据:
第1行输入一个整数n,n为奇数。
接下来n行每行n个整数,表示第一个局面。
再接下来n行每行n个整数,表示第二个局面。
局面中每个整数都是0~n2−1之一,其中用0代表空格,其余数值与奇数码游戏中的意义相同,保证这些整数的分布不重不漏。

输出格式
对于每组数据,若两个局面可达,输出TAK,否则输出NIE。

数据范围
1≤n<500

输入样例:
3
1 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 0
1
0
0

输出样例:
TAK
TAK

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;int n;
long long ans;
vector <int> a[2];
const int N = 510 * 510 + 10;
int c[N];void merge(int k, int l, int mid, int r)
{int x = l, y = mid + 1; //分成两部分 x左 y右for(int i = l; i <= r; i++){if(y > r || (x <= mid && a[k][x] < a[k][y]) ) c[i] = a[k][x++]; //或 后面的部分最好加括号else c[i] = a[k][y++], ans += mid - x + 1; //ans 是加一啊}for(int i = l; i <=r; i++) a[k][i] = c[i];
}void mergesort(int k, int l, int r)
{if(l == r) return;int mid = (l + r) / 2;mergesort(k, l, mid); //递归左半部分mergesort(k, mid + 1, r); //递归右半部分merge(k, l, mid, r); //合并
}long long calc(int k)
{ans = 0;mergesort(k, 0, n*n - 1);return ans;
}int main()
{while(cin >> n){a[0].clear();a[1].clear();for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){int x; scanf("%d", &x); //要用这种输入方式 才不会Segmentation Fault cin >> x 错误if (x) a[0].push_back(x); //除了0都push进数组里}for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){int x; scanf("%d", &x); //要用这种输入方式 才不会Segmentation Faultif(x) a[1].push_back(x);// while( (cin >> x) && x != 0) a[1].push_back(x); //错误}puts( a[0].size() && (calc(1) - calc(0) & 1) ? "NIE" : "TAK"); //判断逆序对是不是偶数,偶数TAK,奇数NIE    奇偶性质  // if( (calc(0) & 1) == (calc(1) & 1) ) puts("TAK"); //第一个局面和第二个局面 逆序对个数相同,即奇偶性相同// else puts("NIE");}
} 

转载于:https://www.cnblogs.com/wmxnlfd/p/10855959.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Gateway(五):路由定位器 RouteLocator

本文基于 spring cloud gateway 2.0.1 1、简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取。 同样&#xff0c; 该 顶 级 接口 有多 个 实现 类&#xff0c; RouteLocator 路由定位器&#xff0c;顾名思义就是用来获取路由的方法。该路由定位器为顶级接口有多个实…

CommonJS,AMD,CMD区别 - 郑星阳 - ITeye博客

CommonJS&#xff0c;AMD&#xff0c;CMD区别 博客分类&#xff1a; seajs和requirejs JavaScript zccst转载 学得比较晕&#xff0c;再次看commonjs&#xff0c;amd, cmd时好像还是没完全弄清楚&#xff0c;今天再整理一下&#xff1a; commonjs是用在服务器端的&#xff…

739. Daily Temperatures

根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高&#xff0c;请输入 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#xff0c;你的输出应…

【NOIP2018】DAY2T2——填数游戏(轮廓线状压的dp?搜索打表)

描述 小 D 特别喜欢玩游戏。这一天&#xff0c;他在玩一款填数游戏。 这个填数游戏的棋盘是一个n m的矩形表格。玩家需要在表格的每个格子中填入一个数字&#xff08;数字 0 或者数字 1&#xff09;&#xff0c;填数时需要满足一些限制。 下面我们来具体描述这些限制。 为了方…

Mysql中遇到的错误

Caused by: java.sql.SQLException: Unknown system variable ‘tx_isolation’ 这种错误是因为数据库版本新的但是mysql的jar包是旧的&#xff0c;所以导入最新的mysqljar包 注意实体类和数据库字段的映射关系&#xff0c;实体类中使用驼峰式的命名规则&#xff0c;大写的字母…

Express 入门之Router - worldtree_keeper的专栏 - CSDN博客

要了解Router我们需要先知道到Application&#xff0c;首先&#xff0c;每一个express实例本身内部就内建了router&#xff0c;所以我们先从简单的下手&#xff0c;先使用application&#xff1b;另外这里我们只选择get方法&#xff0c;作为我们Router.Method, 之所以使用get是…

rest测试定义

1.为什么要做接口测试&#xff1a; 1.因为很多系统关联都是基于接口实现的&#xff0c;接口测试可以将系统复杂的系统关联进行简化 2.接口工程比较单一&#xff0c;能够比较好的进行测试覆盖&#xff0c;也相对容易实现自动化持续集成 3.接口相对于界面功能 &#xff0c;会更底…

团队开发进度报告9

&#xff08;1&#xff09;站立会议 &#xff08;2&#xff09;任务面板 &#xff08;3&#xff09;具体内容 昨天&#xff1a;完成了界面控件按钮的设置问题&#xff1a;PHP数据处理&#xff0c;如何实现在线数据交互问题今天&#xff1a;hbuilder后台环境搭建 转载于:https:/…

nodejs+express整合kindEditor实现图片上传 - 木子丰咪咕晶 - 开源中国

kindEditor官网上中提供了ASP,ASP.NET,JSP相关的整合应用,http://kindeditor.net/docs/upload.html可以参照实现nodejs的整合,发现实用nodejs更简单 环境: unbuntu 14.10 nodejs 0.10.35 express 4.11.2 formidable 1.0.16 kindEditor 4.1.10 webStorm 8 1.通过IDE或终端创建…

基于springboot多模块项目使用maven命令打成war包放到服务器上运行的问题

首先&#xff0c;大家看到这个问题&#xff0c;可能并不陌生&#xff0c;而且脑子里第一映像就是使用mava中的clear package 或者 clear install进行打包&#xff0c;然后在项目中的target文件夹下面找到xxx.war&#xff0c;将这个war包放到外置的tomcat服务器下的webapps下面&…

Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见。 如果更新数据后&#xff0c;并发访问的情况下可立即感知该更新&#xff0c;称为强一致性 如果允许之后部分或全部感知不到该更新&#xff0c;称为弱一致性。 若在之后的一段时间&…

H5页面随机数字键盘支付页面

H5页面随机数字键盘支付页面 有个H5支付的业务需要随机数字的键盘 参考了下文&#xff1a;https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改&#xff1a; 在原有的基础上&#xff0c;增加了一些按键反馈的效果。 每个按键加上边框。 最终效果&…

expressjs路由和Nodejs服务器端发送REST请求 - - ITeye博客

Nodejs创建自己的server后&#xff0c;我们如果需要从客户端利用ajax调用别的服务器端的数据API的接口&#xff0c;这时候出现了ajax跨域问题。 一种是利用在客户端解决跨域问题 这种方案大家可以去网上查查 另一种方案是在服务器端去请求别的服务器&#xff0c;然后将数据再…

Jmeter操作mysql数据库测试

1. 选中线程组鼠标点击右键添加-->配置元件-->JDBC Connection Configuration&#xff1b; 2. DataBase Connection Configuration配置 Variable Name&#xff1a;配置元件的的所有配置所保存的变量&#xff0c;自定义变量名称(不能使用mysql作为变量名&#xff0c;多个…

axios发送自定义请求头的跨域解决

前端发送来的axios请求信息 this.$axios.request({ url:http://127.0.0.1:8001/pay/shoppingcar/, method:post, headers:{ authenticate:a073b3dabbb140e8b9d28debb6a356a1 # 自定义的请求头部信息键值对, }, # 接上,这种key也算是一种请求头,需要加入django中间件内…

前端“智能”静态资源管理 - Onebox - 博客园

前端“智能”静态资源管理 模块化/组件化开发&#xff0c;仅仅描述了一种开发理念&#xff0c;也可以认为是一种开发规范&#xff0c;倘若你认可这规范&#xff0c;对它的分治策略产生了共鸣&#xff0c;那我们就可以继续聊聊它的具体实现了。 很明显&#xff0c;模块化/组件化…

【转】几张图看懂列式存储

几张图看懂列式存储 转载于:https://www.cnblogs.com/apeway/p/10870211.html

hive -e和hive -f的区别(转)

大家都知道&#xff0c;hive -f 后面指定的是一个文件&#xff0c;然后文件里面直接写sql&#xff0c;就可以运行hive的sql&#xff0c;hive -e 后面是直接用双引号拼接hivesql&#xff0c;然后就可以执行命令。 但是&#xff0c;有这么一个东西&#xff0c;我的sql当中有一个s…

我们是如何做好前端工程化和静态资源管理 - 無雄 - 博客园

我们是如何做好前端工程化和静态资源管理 随着互联网的发展&#xff0c;我们的业务也日益变得更加复杂且多样化起来&#xff0c;前端工程师也不再只是做简单的页面开发这么简单&#xff0c;我们需要面对的十分复杂的系统性问题&#xff0c;例如&#xff0c;业务愈来愈复杂&…

Mybatis-plus之RowBounds实现分页查询

物理分页和逻辑分页 物理分页&#xff1a;直接从数据库中拿出我们需要的数据&#xff0c;例如在Mysql中使用limit。 逻辑分页&#xff1a;从数据库中拿出所有符合要求的数据&#xff0c;然后再从这些数据中拿到我们需要的分页数据。 优缺点 物理分页每次都要访问数据库&#xf…