1054:主元素<消除法><sort><partial_sort><nth_element>
2014-03-09 09:47
253 查看
http://pat.zju.edu.cn/contests/pat-a-practise/1054
1. 把不同的元素一对一消除,最后剩下的便是主元素。
2. 先排序,主元素必是中位数。
提示:下表为0, 1, 2, ......n-1 的中位数是a[(n-1)/2]。
主要是想通过这个例子,对比一下三种sort的效率。
partial_sort
nth_element
曾记否,它们的效率是这样的:nth_element > partial_sort > sort 。可是,在这里partial_sort < sort。
解法
这个题目的解法,比较多的。1. 把不同的元素一对一消除,最后剩下的便是主元素。
2. 先排序,主元素必是中位数。
提示:下表为0, 1, 2, ......n-1 的中位数是a[(n-1)/2]。
主要是想通过这个例子,对比一下三种sort的效率。
解法一
// 浙大13机试 // http://pat.zju.edu.cn/contests/pat-a-practise/1054 // // 主元素 // #include <stdio.h> #define SIZE 800*600+10 int a[SIZE]; int main() { #ifdef ONLINE_JUDGE #else freopen("E:\\in.txt", "r", stdin); #endif int m, n; while(scanf("%d%d", &m, &n) != EOF) { int len = m*n; int i, j; for(i=0; i<len; i++) { scanf("%d", &a[i]); }// read i=0, j=len-1; while(i<j) { while(a[i] == a[j]) { i++; }//find target a[i] = -1; a[j] = -1; i++; j--; } for(i=0; i<len; i++) { if(a[i] != -1) { printf("%d\n", a[i]); break; } } }//while return 0; }
解法二
// ------ sort, partial_sort, nth_element ------------- #include <stdio.h> #include <algorithm> #define SIZE 800*600+10 using namespace std; int a[SIZE]; int main() { #ifdef ONLINE_JUDGE #else freopen("E:\\in.txt", "r", stdin); #endif int m, n; while(scanf("%d%d", &m, &n) != EOF) { int len = m*n; int i, j; for(i=0; i<len; i++) { scanf("%d", &a[i]); }// read // sort(a, a+len); // partial_sort(a, a+(len-1)/2+1, a+len); nth_element(a, a+(len-1)/2, a+len); printf("%d\n", a[(len-1)/2]); }//while return 0; }
效率比较
sortpartial_sort
nth_element
曾记否,它们的效率是这样的:nth_element > partial_sort > sort 。可是,在这里partial_sort < sort。
解法三
map#pragma warning(disable : 4786) #include <stdio.h> #include <map> using namespace std; int main() { #ifdef ONLINE_JUDGE #else freopen("E:\\in.txt", "r", stdin); #endif map<int, int> mmap; //num, count int m, n; scanf("%d%d", &m, &n); int limit = m*n/2; m = m*n; while(m-->0) { int t; scanf("%d", &t); mmap[t] ++; //第一次使用时,会自动初始化为0 } map<int, int>::iterator it = mmap.begin(); for(; it != mmap.end() ;it++) { if(it->second > limit) { printf("%d\n", it->first); break; } } // 题目保证有结果,所以下面的代码,作为调试用 if(it == mmap.end()) { printf("No\n"); } return 0; }
相关文章推荐
- Android获取Manifest中<meta-data>元素的值
- Uncaught TypeError: Object #<HTMLDivElement> has no method 'attr'
- Android获取Manifest中<meta-data>元素的值
- 003 超链接元素&lt;a&gt;...&lt;/a&gt;
- Context中嵌套<Environment>元素
- hive 中的Sort By、 Order By、Cluster By、Distribute By 区别<转>
- Hibernate <generator>元素
- Struts2(7):struts.xml中的<package>元素
- Android获取Manifest中<meta-data>元素的值
- Sort a Map<Key, Value> by values (Java)
- Html 5:如何在两个 <div> 元素之间拖放图像
- D3.JS 基于javascript的图表展示库<四>----基本元素选择与Table
- android Collections.sort(List<T> list) 与JAVA Collections.sort(List<T> list)
- var fGrid = document.getElementById("<%=gvReturnSgd.ClientID %>") 的理解
- Android获取Manifest中<meta-data>元素的值
- 解决:error : 元素 <EnableEnhancedInstructionSet> 具有无效值“AdvancedVectorExtensions”。
- 在*.properties文件中 使用pom.xml中&lt;properties&gt;元素
- 为什么不能直接通过document.getElementById("<%= txtCard.ClientID %>")
- HTML5 <script>元素async,defer异步加载
- Collections.sort()及map.Entry<>用法