您的位置:首页 > 其它

NOIP 2007 普及组 复赛 group 纪念品分组

2017-03-30 21:05 489 查看

NOIP 2007 普及组 复赛 group 纪念品分组

1.n<=30000快速排序是免不了了。

2.最大与最小组合,若不行,则最大单独一组,如此重复。贪心算法

3.写法有些类似快速排序,一次性提交AC.

4.注意i==j时,只剩一个数据,也算一组。

附上AC代码,编译环境Dev-C++4.9.9.2

#include <stdio.h>

int p[30000+100];

void quicksort(int left,int right){//自小到大排序

    int i=left,j=right,t;

    int mid=p[(i+j)/2];

    while(i<=j){

        while(p[i]<mid)

            i++;

        while(p[j]>mid)

            j--;

        if(i<=j){

            t=p[i];

            p[i]=p[j];

            p[j]=t;

            i++;

            j--;

        }

    }

    if(left<j)

        quicksort(left,j);

    if(i<right)

        quicksort(i,right);

}

int main(){

    int w,n,i,j;//i标记排好序的左边,j标记排好序的右边

    int count=0;

    scanf("%d%d",&w,&n);

    for(i=1;i<=n;i++)

        scanf("%d",&p[i]);

    quicksort(1,n);

    i=1;

    j=n;

    while(i<j){

        if(p[j]+p[i]<=w){

            j--;

            i++;

            count++;

        }else{

            j--;

            count++;

        }

    }

    if(i==j)

        count++;

    printf("%d\n",count);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: