山东省第七届ACM省赛 Swiss-system tournament

来源:互联网 发布:java正则表达式是什么 编辑:程序博客网 时间:2024/05/22 12:52

用并归排序

改别人的代码,自己的数组越界boom,怎么都找不到bug,气死了,求大神改正

#include <bits/stdc++.h>using namespace std;const int Max = 100100;struct node{    int sore;    int ali;    int Id;    bool operator < (const node &a)const    {        return sore == a.sore ? Id<a.Id : sore > a.sore;    }}a[Max*2],b[Max],c[Max];void Solve(int n){    int num1 = 0,num2 = 0;    for(int i = 0;i<n;i+=2)    {        if(a[i].ali > a[i+1].ali)        {            b[num1]= a[i];            b[num1].sore++; num1++;            c[num2++] = a[i+1];        }        else        {            b[num1]= a[i+1];            b[num1].sore++; num1++;            c[num2++] = a[i];        }    } n=n/2;    int i = 0 ,j = 0,k=0;           for(i=0; i<n*2; i++)            {                if(b[j].sore>c[k].sore)                {                    a[i]=b[j++];                }                else if(b[j].sore==c[k].sore&&b[j].Id<c[k].Id)                {                    a[i]=b[j++];                }                else a[i]=c[k++];                if(j>=n||k>=n)break;            }            if(j>=n)                for(i=i+1; i<n*2; i++)                    a[i]=c[k++];            else                for(i=i+1; i<n*2; i++)                    a[i]=b[j++];}int main(){    int T;    int n,m,k;    scanf("%d",&T);    while(T--)    {        scanf("%d %d %d",&n,&m,&k);        n = 2*n;        for(int i = 0;i<n;i++)        {            scanf("%d",&a[i].sore); a[i].Id = i+1;        }        for(int i = 0;i<n;i++) scanf("%d",&a[i].ali);        sort(a,a+n);        while(m--)        {            Solve(n);        }        printf("%d\n",a[k-1].Id);    }    return 0;}
自己的

#include <bits/stdc++.h>using namespace std;const int Max = 1000100;struct node{    int x,y,i;}a[Max*2],b[Max],c[Max],t1;bool cmp(node a,node b){    if(a.x!=b.x)return a.x>b.x;    else return a.i<b.i;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,r,q;        scanf("%d%d%d",&n,&r,&q);        for(int i=1; i<=2*n; i++)        {            scanf("%d",&a[i].x);            a[i].i=i;        }        for(int i=1; i<=2*n; i++)            scanf("%d",&a[i].y);        sort(a+1,a+n*2+1,cmp);        int i,num1,num2;        num1=num2=0;        while(r--)        {            for(i=1; i<=2*n; i+=2)            {                if(a[i].y>a[i+1].y)                {                    a[i].x++;                    b[++num1]=a[i];                    c[++num2]=a[i+1];                }                else                {                    a[i+1].x++;                    b[++num1]=a[i+1];                    c[++num2]=a[i];                }            }            int j,k;            j=k=1;            for(i=1; i<=n*2; i++)            {                if(b[j].x>c[k].x)                {                    a[i]=b[j++];                }                else if(b[j].x==c[k].x&&b[j].i<c[k].i)                {                    a[i]=b[j++];                }                else a[i]=c[k++];                if(j>n||k>n)break;            }            if(j>n)                for(i=i+1; i<=n*2; i++)                    a[i]=c[k++];            else                for(i=i+1; i<=n*2; i++)                    a[i]=b[j++];        }          printf("%d\n",a[q].i);    }    return 0;}/***************************************************User name: 但求心安Result: Runtime ErrorTake time: 0msTake Memory: 0KBSubmit time: 2017-04-20 17:23:54****************************************************/



0 0
原创粉丝点击