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;
}