咕咕咕~

A. 第k小数 (快排,STL之nth_element)

题意:

给定一个序列,求第k小数的值。

思路:

1.会把sort卡掉,可以用快速排序的思想来做。

2 .C++的STL里有一个 nth_element ,可以线性寻找第k小数,get了。

代码:

1 . https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43822588

2 .

const int maxn=5e6+100;
int a[maxn],n;

int main(){
   int T=read();
    while(T--){
        int n,k;
        n=read(),k=read();
        for(int i=1;i<=n;i++) a[i]=read();
        nth_element(a+1,a+k,a+1+n);
        cout<<a[k]<<endl;
    }
    return 0;
}

B. 不平行的直线 (STL之set)

题意:

n个点,两两可以成为一个直线,问最多能够选出多少条直线使得他们不平行也不重合。

思路:

两层for循环枚举求出斜率,用set存一下,最后输出set的大小。

要注意斜率不存在的情况,可以假设等于一个特殊的数字。

因为x,y的范围都是-1000~1000,所以斜率为10000的情况是不会出现的,可以假设斜率不存在时的斜率为10000;

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43859895

C.丢手绢(三分,尺取)

题意:

给一个圆圈,给定相邻两点间的距离,定义不相邻两点之间的距离为 沿着圆圈顺时针走或者逆时针走的最近距离。 求两点的最远距离。

思路:

直接放巨巨题解

D.二分(差分)

题意:

猜数游戏,如果猜的数字大于答案,就输出“+”;如果猜的数字小于答案,就输出“-”;如果等于答案,就输出“.”,给出n个回答,问最多有多少条回答可以同时正确。

思路:

考虑每个回答x对答案的贡献。

如果是+,说明该回答对[-inf,x-1]的数都有贡献;

如果是-,说明该回答对[x+1,inf]的数都有贡献;

如果是.,说明该回答对x这个数做出了贡献;

然后就可以前缀和求一个被覆盖最多的数了。

因为数据很大,可以离散化一下,也可以直接用map来存。

然后inf必须是int的最大值,0x3f3f3f3f是过不去的。

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43860083

E.交换

题意:

求最少交换多少次才能使数组从小到大有序。

思路:

本来以为是个求逆序对结果死活过不去0.0

然后卑微看完了所有题解,终于在Aarynon巨巨的图解说明下懂得了

因为是可以任意选两个数交换,结合一下巨巨的图解,对于每一个环,交换次数就是环长度-1,最后答案就是所有环的长度之和-环的个数,即n-环的个数。

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43860226