SDUT2781二分练习
来源:互联网 发布:php中使用url传递数组 编辑:程序博客网 时间:2024/05/17 12:56
题目一如既往的坑 1.未说明是否排序(必须排)2.两数字相同输出几个(输出一个 只能试)
与网上其他代码思路不太相同
Problem Description
给你一个序列,然后给你m个元素,让你从序列中找出与每个元素最接近的数字输出来,如果有两个就输出两个。
Input
多组输入,第一行给你两个数n(0 < n < 10000000),m(0 < m < n),接下来是数列的n个数,然后再输入m个元素,让你找出最接近每个元素的值。如果有两个,按从小到大输出。
Output
这m个数分别输出最接近每个元素的值,组与组之间输出一个空行。
Example Input
8 41 2 3 4 5 6 8 114927
Example Output
4826 8
Hint
#include<stdio.h>int n;int s[10000005];void qsort(int l, int r){ if(l >= r) return ; int i = l, j = r; int key = s[l]; while(i < j) { while(i < j && s[j] >= key) j--; s[i] = s[j]; while(i < j && s[i] <= key) i++; s[j] = s[i]; } s[i] = key; qsort(l, i - 1); qsort(i + 1, r);}void ef(int l, int r, int key){ if(l > r) //当无相同数据时分三种情况 { if(l == 0) //比最小值还小 输出最小值 printf("%d\n", s[l]); else if(r == n - 1) // 比最大值还大 输出最大值 printf("%d\n", s[r]); else //否则与他最接近的两个数必然为s[r]与s[l] 很简单 自行推导 { if(key - s[r] > s[l] - key) printf("%d\n", s[l]); else if(key - s[r] < s[l] - key) printf("%d\n", s[r]); else printf("%d %d\n", s[r], s[l]); } } else { int mid = (l + r)/2; if(s[mid] > key) { ef(l, mid - 1, key); } else if(s[mid] < key) { ef(mid + 1, r, key); } else printf("%d\n", key); //题目中未说明两个数相同只输出一个 这个只能试了 还好我运气好 }}int main(){ int m; while(~scanf("%d %d", &n, &m)) { int i; for(i = 0; i < n; i++) scanf("%d", &s[i]); qsort(0, n - 1); //必须先排序 int key; while(m--) { scanf("%d", &key); ef(0, n - 1, key); } printf("\n"); } return 0;}
阅读全文
0 0
- sdut2781 二分练习
- SDUT2781二分练习
- sdut2781
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 二分练习
- 【2781】二分练习 sdutOJ
- 二分查找代码练习
- 二分练习题解
- SDUT 2781 二分练习
- SDUT-二分练习
- 使用nginx和uWSGI搭建Django网站
- P1308 统计单词数
- [kuangbin带你飞]专题一 简单搜索 A
- Libvirt命令参数详解
- 设计模式的征途—20.备忘录(Memento)模式
- SDUT2781二分练习
- windows下PHP + Nginx curl访问本地超时
- 数据库隔离级别
- NOIP 2016
- STL常用容器用法之——Deque
- Qt应用程序的发布
- 步进电机的使用一
- Vector容器
- MOOC清华《面向对象程序设计》第4章:虚函数实验