南京外國語學校暑期集訓7/8號排序2

e4ns發表於2024-07-08


顯然,這道題使用快排第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;
}

相關文章