计数与排序问题
2011-04-09 13:14
204 查看
2011-04-09 wcdj
问题描述:
将N(1<= N <= 200000)个整数从小到大连续编号,相同的数应具有相同的编号。并按这N个数输入时的顺序输出它们的编号序列。例如,设输入数据为 5 3 4 7 3 5 6,则输出数据为3 1 2 5 1 3 4。
【输入形式】
从标准输入读取数据。
输入包含N个数字(1<= N <= 200000),之间由空格分隔,以回车符作为结束。
【输出形式】
计算结果输出到标准输出。
按这N个数输入时的顺序输出它们的编号序列。每个序号之后紧跟一个空格符,最后输出回车符。
【输入样例】
5 3 4 7 3 5 6
【输出样例】
3 1 2 5 1 3 4
方法1:不排序
时间复杂度:O(N^2)
方法2:排序
时间复杂度:O(N*lbN)
方法3:使用stl中的map
问题描述:
将N(1<= N <= 200000)个整数从小到大连续编号,相同的数应具有相同的编号。并按这N个数输入时的顺序输出它们的编号序列。例如,设输入数据为 5 3 4 7 3 5 6,则输出数据为3 1 2 5 1 3 4。
【输入形式】
从标准输入读取数据。
输入包含N个数字(1<= N <= 200000),之间由空格分隔,以回车符作为结束。
【输出形式】
计算结果输出到标准输出。
按这N个数输入时的顺序输出它们的编号序列。每个序号之后紧跟一个空格符,最后输出回车符。
【输入样例】
5 3 4 7 3 5 6
【输出样例】
3 1 2 5 1 3 4
方法1:不排序
时间复杂度:O(N^2)
#include <iostream> #include <string> #include <sstream> using namespace std; #define N 200000 int data ; int map ; int main() { int i = 0, tmp = 0, cnt = 0, len = 0; string input; getline(cin, input); istringstream input_istring(input); char s[12]=""; while (input_istring.getline(s, 12, ' ')) { tmp = atoi(s); data[i++] = tmp; map[tmp] = 1; } len = i; i = 0; for (int j = 0; j<N; ++j) { if (map[j] == 1) { ++cnt; if (j == data[i]) { cout<<cnt<<" "; ++i; j = 0; cnt = 0; } } if (i == len) break; } cout<<endl; return 0; }
方法2:排序
时间复杂度:O(N*lbN)
#include <stdio.h> int A[200001]; int A2[200001]; int B[100001]; void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } void qsort(int a[], int l, int r) { int i = l; int j = r; int k = a[(i + j) / 2]; while (i < j) { for (; (i < r) && (a[i] < k); ++i); for (; (j > l) && (a[j] > k); --j); if (i <= j) { swap(&a[i], &a[j]); ++i; --j; } } if (i < r) { qsort(a, i, r); } if (j > l) { qsort(a, l, j); } } int main() { int m = 1, n = 0, i =0; while (scanf("%d", &A[++n]) != EOF) { if ((i = getchar()) == '/n') { break; } } for (i = 1; i <= n; ++i) { A2[i] = A[i]; } qsort(A2, 1, n); B[A2[1]] = m; for (i = 2; i <= n; ++i) { if (A2[i] == A2[i - 1]) { continue; } else { B[A2[i]] = ++m; } } for (i = 1; i <= n; ++i) { printf("%d ", B[A[i]]); } printf("/n"); return 0; }
方法3:使用stl中的map
#include <iostream> #include <algorithm> #include <vector> #include <map> using namespace std; vector<int> input,rec; map<int,int> update; int n; int main() { int num, ch; while (cin>>num) { input.push_back(num); rec.push_back(num); if ((ch = getchar()) == '/n') { break; } } sort(input.begin(),input.end());// 排序 int cnt=0; for(vector<int>::iterator iter=input.begin();iter!=input.end();++iter) { if(update.count(*iter)==0) { update[*iter] = ++cnt; } } for(vector<int>::iterator it=rec.begin(); it!=rec.end(); ++it) { cout<<update[*it]<<" "; } cout<<endl; return 0; }
相关文章推荐
- 「巧妙的计数」丑数问题、sort colors等排序问题
- oracle分页查询数据重复问题、分页排序陷阱
- 今天谈谈OC中MRC手动引用计数的内存释放问题
- SQLSERER 中select排序问题
- Luogu 1169 棋盘制作:计数问题
- 关于oracle对null排序的问题
- 分组排序的问题
- iOS中关于数组排序问题
- UVA-11806 Cheerleaders 计数问题 容斥定理
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- Polya计数理论之染色问题
- 集合中元素大小的可排序问题
- 数据量很大的排序问题 大量数据如何排序
- 排序问题的分治法
- 问题一百三十:字符矩阵排序
- android中Sqlite查询的数据返回排序问题
- [置顶] 算法笔记 //05_有重复元素的排列问题(针对字母排序)
- 字典排序问题加强版(java)
- 希尔顿宾馆里的排序问题^_^
- 题目1007:奥运排序问题