程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 紀念品分組 2007年NOIP全國聯賽普及組,2007年noip

紀念品分組 2007年NOIP全國聯賽普及組,2007年noip

編輯:關於C語言

紀念品分組 2007年NOIP全國聯賽普及組,2007年noip


題目描述

       元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。

你的任務是寫一個程序,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。

輸入輸出格式

輸入描述:

包含n+2行:

第1行包括一個整數w,為每組紀念品價格之和的上限。

第2行為一個整數n,表示購來的紀念品的總件數。

第3~n+2行每行包含一個正整數pi (5 <= pi <= w),表示所對應紀念品的價格。

輸出描述:

僅一行,包含一個整數,即最少的分組數目。

輸入輸出樣例

輸入樣例#1:

100

9

90

20

20

30

50

60

70

80

90

輸出樣例#1:

6

思路

先將數據快排,然後for循環將第一個與最後一個相加,如果得數不大於紀念品價格之和的上限,第一個與最後一個為一組。否則,將第二個與最後一個匹配,以此類推。

代碼

#include<stdio.h> long long a[30010]; void qsort(int l,int r) { int i,j,mid,p; i=l;j=r; mid=a[(l+r)/2]; do { while(a[i]<mid) i++; while(a[j]>mid) j--; if(i<=j) { p=a[i]; a[i]=a[j]; a[j]=p; i++;j--; } }while(i<=j); if(l<j) qsort(l,j); if(i<r) qsort(i,r); } int main() { long long n,i,w,k=0,j,l; scanf("%lld%lld",&w,&n); for(i=1;i<=n;i++) scanf("%lld",&a[i]); qsort(1,n); l=1; for(i=n;i>=l;i--) { if(a[i]+a[l]<=w) l++; k++; } printf("\n%lld",k); return 0; } View Code

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved