南京外国语学校暑期集训7/8号排序2


显然,这道题使用快排第k大做,快排第k大思想:(下标从1开始)每次找一个key值,一轮后可以得到key在原数组中的位置(暂且称之为a),把a和n-k+1值比较,一样就返回,小就往左边找,大就往右边找。
然后原数组在main里按题目要求初始化一下就行了

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e7 + 10,P = 1000000007;
int s[N];
int n,k;
void qsort(int L,int R)
{
	int low=L,high=R;
	int key=s[low];
	while(low<high)
    {
		while(low<high&&key<=s[high])high--;
		if(low<high)s[low]=s[high];
		while(low<high&&key>=s[low])low++;
		if(low<high)s[high]=s[low];
	}
	s[low]=key;
	if(L<low-1)qsort(L,low-1);
	if(low+1<R)qsort(low+1,R);
}
signed main()
{
	scanf("%d%d%d",&n,&s[1],&k);
	for(int i = 2;i <= n;i ++ )
  {
		s[i] = 1ll * s[i - 1] * 1ll * s[i - 1] % P;
	}
	qsort(1,n);
	printf("%d\n",s[n - k + 1]);
	return 0;
}


思路:因为有两个拦截导弹,所以所有导弹必被两个系统瓜分,所以我们可以枚举两个系统拦截的导弹,对两个数组取最大值,然后就去打擂台比较最优值。
附带公式:两点距离公式用这个(x1 - x2)2+(y1 - y2)2

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define y1 y12312
int x1,y1,x2,y2,n;
int d[6000005];
struct node
{
	int x;
	int y;
}w[6000005];
bool cmp(node a,node b)
{
	int q=(x1-a.x)*(x1-a.x)+(y1-a.y)*(y1-a.y);
	int p=(x1-b.x)*(x1-b.x)+(y1-b.y)*(y1-b.y);
	return q<p; 
} 
int main()
{
	int ans=0;
	cin>>x1>>y1>>x2>>y2;
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>w[i].x>>w[i].y;
	sort(w,w+n,cmp);
	for(int i=n-1;i>=0;i--)
	{
		int h=(x2-w[i].x)*(x2-w[i].x)+(y2-w[i].y)*(y2-w[i].y);
		d[i]=max(d[i+1],h);
	}
	ans=d[0];
	for(int i=0;i<n;i++)
	{
		int cnt=0;
		cnt=(x1-w[i].x)*(x1-w[i].x)+(y1-w[i].y)*(y1-w[i].y);
		cnt+=d[i+1];
		ans=min(ans,cnt);
	 } 
	cout<<ans;
}


用结构体将人存起来

每次两两比较,赢的放在一个数组,输的放在另一个数组因为之前已经有序,可以保证两数组前面的排名在后面之前所以只要比较从两数组开头开始比就可以,差不多就是归并排序用另一个数组存,两数组开头比较,排名靠前的放进去,此数组开头向后移

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=600001;
struct node
{
	int No,shili,score;
};
node a[N],b[N],c[N];
int n,r,q;
bool cmp(node x,node y)
{
	if(x.score!=y.score) return x.score>y.score;
	return x.No<y.No;
}
void deal()
{
	int i,j,k,j1,k1;
	for(i=0;i<n;i++)
		if(a[2*i].shili>a[2*i+1].shili)
		{
			a[2*i].score++;
			b[i]=a[2*i];
			c[i]=a[2*i+1];
		}
		else
		{
			a[2*i+1].score++;
			b[i]=a[2*i+1];
			c[i]=a[2*i];
		}
	for(i=j=k=0;j<n&&k<n;i++)
	{
		a[i]=(cmp(b[j],c[k])?b[j++]:c[k++]);
	}
	while(j<n) a[i++]=b[j++];
	while(k<n) a[i++]=c[k++]; 
}
int main()
{
	cin>>n>>r>>q;
	for(int i=0;i<n+n;i++)
	{
		cin>>a[i].score;
		a[i].No=i+1;
	}
	for(int i=0;i<n+n;i++) cin>>a[i].shili;
	sort(a,a+2*n,cmp);
	for(int i=0;i<r;i++)
		deal();
	cout<<a[q-1].No<<endl;
}
posted @ 2024-07-08 21:39  e4ns  阅读(30)  评论(0)    收藏  举报