牛客算法入门课第一次练习赛题解
A 第K小数
链接:https://ac.nowcoder.com/acm/contest/5773/A
题意:
找到从小到大排好序后的第K个数
题解:
用快读+sort排序就好了
注意:
数据范围是5e6
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int a[5000005]; inline int read(){ int x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if (ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ x = (x<<1) + (x<<3) + (ch^48); ch = getchar(); } return x * f; } int main() { int n; scanf("%d",&n); while(n--) { memset(a,0,sizeof(a)); int s,t; s=read(); t=read(); for(int i=0;i<s;i++) { a[i]=read(); } sort(a,a+s); printf("%d\n",a[t-1]); } return 0; }
B 不平行的直线
链接:https://ac.nowcoder.com/acm/contest/5773/B
题意:
找到两点连接形成的不同直线的个数
题解:
直线平行或者重合都是由直线的斜率决定,也就是说,直线的条数即为斜率K的个数。其中斜率的求法(y2-y1)/(x2-x1)。暴力求出所有的k,用stl中的set来记录就好了。因为set函数能够自动去重,.size()函数直接计算k的个数。
注意:
注意k值为无穷(x1==x2)的时候要分情况考虑
还有斜率是小数,所以要用double类型
代码:
#include<iostream> #include<cstdio> #include<set> using namespace std; struct node{ double x;double y; }mark[205]; int main() { set<double>KKK; int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf%lf",&mark[i].x,&mark[i].y); } int s=0; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { if(mark[i].x==mark[j].x)s=1; else { KKK.insert((mark[i].y-mark[j].y)/(mark[i].x-mark[j].x)); } } } printf("%d",KKK.size()+s); return 0; }
E 交换
链接:https://ac.nowcoder.com/acm/contest/5773/E
题意:
任意两个人之间的次序可以进行交换,为使数列有序,求交换的最少次数
题解:
先将数列排好序存起来,再将这个数列与原先的数列进行一个对照。找到循环节的个数。而循环节里面的个数-1就是需要交换的次数。将所有不能一一对应的数个数统计出来-循环节的个数就好了。
注意:
可以用map来找编号,for的话会T。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int a[100009]; int b[100009]; int flag[100009]; #include<map> int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(flag,0,sizeof(flag)); map<int,int>m; int n;int j=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+n+1); for(int i=1;i<=n;i++) { m[b[i]]=i; } int y=0;int s=0; for(int i=1;i<=n;i++) { if(b[i]==a[i])continue; s++; if(flag[i]==1)continue; int x=a[i]; while(x!=b[i]) { int j=m[x]; x=a[j]; flag[j]=1; } y++; } printf("%d\n",s-y); return 0; }