90分,救命
查看原帖
90分,救命
398155
某kob在此楼主2020/12/9 13:32
#include <bits/stdc++.h>
using namespace std;

int n, r, q;  
int a[200100], win[200100], lose[200100];  
int s[200100], w[200100];

bool cmp(int x, int y)
{ 
	if(s[x] == s[y])
		return x < y;
	return s[x] > s[y];
}

void merge()  
{  
	int i,j;
	i = j = 1, a[0] = 0;  
	while(i <= win[0] && j <= lose[0])
	{
		if(cmp(win[i], lose[j]))
		{
			a[0] ++;
			a[a[0]] = win[i];
			i ++; 
		}
	    else
	    {
	    	a[0] ++;
	    	a[a[0]] = lose[j];
			j ++;  
		}
	}
	
	while(i <= win[0])
	{
		a[0] ++;
		a[a[0]] = win[i];
		i ++;
	}
	
	while(j <= lose[0])
	{
		a[0] ++;
		a[a[0]] = lose[j];
		j ++;
	}
}
int main()  
{
	int i, j; 
	cin >> n >> r >> q;
	n *= 2;
	  
	for(i = 1; i <= n; i ++)
		a[i] = i;  
	for(i = 1; i <= n; i ++)
		scanf("%d", &s[i]);  
	for(i = 1; i <= n; i ++)
		scanf("%d", &w[i]);
	
	sort(a + 1, a + n + 1, cmp);  
	for(i = 1; i <= r; i ++)
    {
    	win[0] = lose[0] = 0;  
    	for(j = 1; j <= n; j += 2)
    	{
    		if(w[a[j]] > w[a[j + 1]])  
		    {
		        s[a[j]] ++;
		        win[0] ++;
		        lose[0] ++;
		        
				win[win[0]] = a[j];  
		        lose[lose[0]] = a[j + 1];  
		    }
		    else
		    {
		        s[a[j + 1]] ++;
		        win[0] ++;
		        lose[0] ++;
		        win[win[0]] = a[j + 1];
		        lose[lose[0]] = a[j];
			}
		}
		
    	if(w[a[j]] > w[a[j + 1]])
        {
        	s[a[j]] ++;
        	win[0] ++;
		    lose[0] ++;
            win[win[0]] = a[j];  
            lose[lose[0]] = a[j + 1];  
        }
        else
    	{
            s[a[j + 1]] ++;  
            win[++ win[0]] = a[j + 1];  
            lose[++ lose[0]] = a[j];
    	}
    	merge();
    }  
	cout << a[q];
  
	return 0;  
}

一个朴素的归并。。。

但还是错了。。。

2020/12/9 13:32
加载中...