河南多校联合训练 南阳理工 1261 音痴又音痴的LT

描述

LT最近一直在无限循环薛之谦的歌,简直都中毒了!可是呢…他的歌LT还是不会唱(其实不止他的歌LT不会唱,所有人的歌LT都不会唱…因为LT是标准的音痴)可是LT又很喜欢唱歌(所以LT不仅是音痴还是音痴)…没错,这对于LT的室友来说简直是噩梦…

    现在呢,LT有N次操作,每次操作只会有两种可能:

  I a: 表示着LT使用唱歌软件唱歌得到的分数。

  Q k: 表示着LT想知道自己得到的第k小的分数是多少。(如果没有第k小,输出-1)

 
输入
有多组输入(不超过20组),每组输入的第一行是一个N,表示有N次操作。(0<N<100000)
接下来的2到N+1行每行有一个操作op和一个数字num。op只可能是I或Q,0<=num<1000000
输出
对于每一个Q操作,输出对应的答案~(~ ̄▽ ̄)~
样例输入
10
Q 123
I 123
I 32
Q 1
Q 2
Q 2
I 32
Q 1
Q 2
Q 3
样例输出
-1
32
123
123
32
32
123

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1261

************************************************

T完了之后就蒙了,只过了一遍啊,审核一遍,就想到sort的复杂度是nlogn,然后想原始二分吧,分完了又好像不太会排序问题了,找复杂度更低的排序方法吧,找到了个桶排序O(n),可惜貌似应用不了,直到后来的后来,才恍然想起刚了解不久的二分函数,在二分函数的基础上认识了插入排序这种排序方法。O(logn).

插入排序实现过程:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N 8
 4 void insert_sort(int a[],int n);
 5 //插入排序实现,这里按从小到大排序
 6 void insert_sort(int a[],int n)//n为数组a的元素个数
 7 {
 8 //进行N-1轮插入过程
 9 for(int i=1; i<n; i++)
10 {
11 //首先找到元素a[i]需要插入的位置
12 int j=0;
13 while( (a[j]<a[i]) && (j<i))
14 {
15 j++;
16 }
17 //将元素插入到正确的位置
18 if(i != j)  //如果i==j,说明a[i]刚好在正确的位置
19 {
20 int temp = a[i];
21 for(int k = i; k > j; k--)
22 {
23 a[k] = a[k-1];
24 }
25 a[j] = temp;
26 }
27 }
28 }
29 int  main()
30 {
31 int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
32 insert_sort(num, N);
33 for(int i=0; i<N; i++)
34 printf("%d  ", num[i]);
35 printf("
");
36 system("pause");
37 return 0;
38 }

AC代码:

 1  #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<time.h>
 7 #include<stack>
 8 #include<vector>
 9 using namespace std;
10 #define N 120000
11 #define INF 0x3f3f3f3f
12 
13 vector<int >Q;
14 
15 int main()
16 {
17     int T,a,j;
18     char s[10];
19 
20     while(scanf("%d", &T) != EOF)
21     {
22         Q.clear();
23 
24        for(j=0;j<T;j++)
25         {
26             scanf("%s%d", s, &a);
27 
28             if(s[0]=='I')
29             {
30                 int x=upper_bound(Q.begin(),Q.end(),a)-Q.begin();
31                 Q.insert(Q.begin()+x,a);
32             }
33             else
34             {
35                 int len=Q.size();
36 
37                 if(a>len)
38                     printf("-1
");
39                 else
40                     printf("%d
", Q[a-1]);
41             }
42         }
43     }
44     return 0;
45 }

 

原文地址:https://www.cnblogs.com/weiyuan/p/5796453.html