3 solutions

  • 0
    @ 2024-9-16 16:30:47
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    struct Participator{
    	int score,force,id;
    }p[N];
    bool cmp(Participator x,Participator y)
    {
    	if(x.score>y.score) return true;
    	return false;
    }
    int main()
    {
    	int n,r,q;
    	cin>>n>>r>>q;
    	for(int i=1;i<=n*2;i++)
    	{
    		cin>>p[i].score; 
    	}
    	for(int i=1;i<=n*2;i++)
    	{
    		cin>>p[i].force;
    		p[i].id=i;
    	}
    	sort(p+1,p+2*n+1,cmp);
    	while(r--)
    	{
    		vector<Participator> winner,loser;
    		for(int i=1;i<=2*n;i+=2)
    		{
    			if(p[i].force>p[i+1].force)
    			{
    				p[i].score++;
    				winner.push_back(p[i]);
    				loser.push_back(p[i+1]);
    			}
    			else
    			{
    				p[i+1].score++;
    				winner.push_back(p[i+1]);
    				loser.push_back(p[i]);
    			}
    		}
    		int cnt=1,cnt1=0,cnt2=0;
    		while(cnt1<n&&cnt2<n)
    		{
    			if(winner[cnt1].score>loser[cnt2].score)
    			{
    				p[cnt++]=winner[cnt1];
    				cnt1++;
    			}
    			else 
    			{
    				p[cnt++]=loser[cnt2];
    				cnt2++;
    			}
    		}
    		while(cnt1<n)
    		{
    			p[cnt++]=winner[cnt1];
    			cnt1++; 
    		}
    		while(cnt2<n)
    		{
    			p[cnt++]=loser[cnt2];
    			cnt2++; 
    		} 
    	}
    	cout<<p[q].id;
    	return 0;
    }
    
    • 0
      @ 2024-6-11 13:33:24

      快排(RNlogNRNlog^N 60pts)

      • 进行瑞士轮模拟,每次比较以后调用快速排序规则进行排序。
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      struct Node{
          int sc;
          int w;
          int id;
      }s[N],q1[N],q2[N];
      bool cmp(Node a,Node b) //排序规则
      {
          if(a.sc>b.sc) return 1;
          if(a.sc==b.sc&&a.id<b.id) return 1;
          return 0;
      }
      int main()
      {
          int n,r,q;
          cin>>n>>r>>q;
          for(int i=1;i<=2*n;i++) cin>>s[i].sc;
          for(int i=1;i<=2*n;i++)
          {
              cin>>s[i].w;
              s[i].id=i;
          }
          sort(s+1,s+2*n+1,cmp); //排序
          while(r--)
          {
              for(int i=1;i<=2*n;i+=2) //按照瑞士轮规则进行比较
              {
                  if(s[i].w>s[i+1].w)
                  {
                      s[i].sc++;
                  }
                  else
                  {
                      s[i+1].sc++;
                  }
              }
              sort(s+1,s+2*n+1,cmp); //比较完了以后重新排名
          }
          cout<<s[q].id;
          return 0;
      }
      

      快排+归并(NlogN+RNNlogN+RN)

      • 首轮进行快速排序,然后在后面模拟瑞士轮的时候进行胜者组和败者组,然后对胜者组和败者组进行归并排序的归并过程。
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      struct Node{ //结构体
          int sc;
          int w;
          int id;
      }s[N],q1[N],q2[N]; //q1为胜者组,q2为败者组
      bool cmp(Node a,Node b) //排序
      {
          if(a.sc>b.sc) return 1;
          if(a.sc==b.sc&&a.id<b.id) return 1;
          return 0;
      }
      int main()
      {
          int n,r,q;
          cin>>n>>r>>q;
          for(int i=1;i<=2*n;i++) cin>>s[i].sc;
          for(int i=1;i<=2*n;i++)
          {
              cin>>s[i].w;
              s[i].id=i;
          }
          sort(s+1,s+2*n+1,cmp); //首轮排序
          while(r--)
          {
              int x=0,y=0; //生成组和败者组初始化
              for(int i=1;i<=2*n;i+=2) //模拟瑞士轮
              {
                  if(s[i].w>s[i+1].w)
                  {
                      s[i].sc++;
                      q1[++x]=s[i];
                      q2[++y]=s[i+1];
                  }
                  else
                  {
                      s[i+1].sc++;
                      q1[++x]=s[i+1];
                      q2[++y]=s[i];
                  }
              }
              x=1,y=1; //开始合并
              int k=1;
              while(x<=n&&y<=n) //合并
              {
                  if(cmp(q1[x],q2[y]))
                  {
                      s[k++]=q1[x++];
                  }
                  else s[k++]=q2[y++];
              }
              while(x<=n) s[k++]=q1[x++]; //合并剩余的胜者组
              while(y<=n) s[k++]=q2[y++]; //合并剩余的败者组
          }
          cout<<s[q].id;
          return 0;
      }
      
      • -2
        @ 2024-7-18 16:25:27
        #include<bits/stdc++.h>
        using namespace std;
        const int N=1e8+10;
        int n,r,q;
        struct PII{
        	int li;
        	int x;
        	int i;
        }a[N];
        void run(PII x,PII y){
        	if(x.li>y.li) x.x++;
        	else y.x++;
        }
        bool Sort(PII x,PII y){
        	if(x.x>y.x) return 1;
        	if(x.x==y.x && x.i<y.i) return 1;
        	return 0;
        }
        int main(){
        	cin>>n>>r>>q;
        	n*=2;
        	for(int i=1;i<=n;i++){
        		cin>>a[i].x;
        		a[i].i=i;
        	}
        	for(int i=1;i<=n;i++) cin>>a[i].li;
        	sort(a+1,a+1+n,Sort);
        	while(r--){
        		for(int i=1;i<=n;i+=2) run(a[i],a[i+1]);
        		sort(a+1,a+1+n,Sort);
        	}
        	cout<<a[q].i;
            return 0;
        }
        
        • 1

        Information

        ID
        435
        Time
        1000ms
        Memory
        128MiB
        Difficulty
        8
        Tags
        # Submissions
        39
        Accepted
        6
        Uploaded By