日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

日志:贪心

發(fā)布時(shí)間:2023/12/3 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志:贪心 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

排隊(duì)接水

時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB
題目描述
有n 個(gè)人在一個(gè)水龍頭前排隊(duì)接水,假如每個(gè)人接水的時(shí)間為ti ,請(qǐng)編程找出這n 個(gè)人
排隊(duì)的一種順序,使得n 個(gè)人的平均等待時(shí)間最小。
輸入
第一行為n(1<=n<=5000)。第二行分別表示第1 個(gè)人到第n 個(gè)人每人的接水時(shí)間t1,
t2…,tn,每個(gè)數(shù)據(jù)之間有一個(gè)空格。(0<=ti<=10000)
輸出
共兩行,第一行為一種排隊(duì)順序,即1 到n 的一種排列,且保證小序號(hào)靠前(如:“2 3”
與“3 2”,在平均等待時(shí)間一樣時(shí),輸出“2 3”;第二行為這種排列方案下的平均等待時(shí)
間(輸出結(jié)果精確到小數(shù)點(diǎn)后兩位,在小數(shù)點(diǎn)后三進(jìn)行四舍五入)。
樣例輸入
10
56 12 1 99 1000 234 33 55 99 812
樣例輸出
3 2 7 8 1 4 9 6 10 5
291.90
解析:
這題比較簡(jiǎn)單,要使得后面等待的時(shí)間少,那么盡量讓接水時(shí)間短的人排在前面,于是
我們可以使用二級(jí)排序,優(yōu)先讓接水時(shí)間短的人排在前面,如果接水時(shí)間一樣,就按讀入的
順序小的排在前面,這樣就能做到最優(yōu)方案了,至于最終的時(shí)間,就模擬一下統(tǒng)計(jì)總時(shí)間,
然后除以人數(shù)。(需要注意的是,第一個(gè)人不用等待,但第一個(gè)人接水的時(shí)間就是第二個(gè)人
等待時(shí)間,最后一個(gè)人的接水時(shí)間沒(méi)意義,因?yàn)闆](méi)人等待了)

#include// 不難
#include
using namespace std;
struct ren{
int time,id;
}(p[5100]);
bool cmp(ren x,ren y){
if(x.time!=y.time)return x.time<y.time;
return x.id<y.id;
}
int main(){
int i,tot=0,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&p[i].time);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;i++){
tot += (n-i)p[i].time;
printf("%d “,p[i].id);
}
printf(”%.2f",1.0tot/n);
return 0;
}

最大整數(shù)

時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB
題目描述
設(shè)有n 個(gè)正整數(shù)(n<=20),將它們連接成一排,組成一個(gè)最大的多位數(shù)。
例如:n=3 時(shí),3 個(gè)整數(shù)13,312,343 連接成的最大整數(shù)為:34331213
又如:n=4 時(shí),4 個(gè)整數(shù)7,13,4,246 連接成的最大整數(shù)為:7424613
輸入
第1 行,n;
第2 行,n 個(gè)數(shù)。
輸出
連接成的多位數(shù)。
樣例輸入
3 13 312 343
樣例輸出
34331213
解析:
此題很容易想到使用貪心法,在考試時(shí)有很多同學(xué)把整數(shù)按從大到小的順序連接起來(lái),
測(cè)試題目的例子也都符合,但最后測(cè)試的結(jié)果卻不全對(duì)。按這種標(biāo)準(zhǔn),我們很容易找到反例:
12,121 應(yīng)該組成12121 而非12112,那么是不是相互包含的時(shí)候就從小到大呢?也不一
定,如12,123 就是12312 而非12123,這種情況就有很多種了。是不是此題不能用貪
心法呢?
其實(shí)此題可以用貪心法來(lái)求解,只是剛才的標(biāo)準(zhǔn)不對(duì)。我們發(fā)現(xiàn)更最基本的排序一樣,
哪個(gè)數(shù)字在前,哪個(gè)數(shù)字在后,比較的是兩種方案的大小比較。假設(shè)已經(jīng)有最優(yōu)方案產(chǎn)生前
面的數(shù)字t,當(dāng)前要比較先接a,還是先接b,我們可以比較t+a+b 和t+b+a(這里的“+”
是連接符號(hào)),如果t+a+b>=t+b+a,那么先接a,反之先接b。但其實(shí)只要比較a+b 和
b+a 就行了,因?yàn)閠 是公共部分,于是基本的貪心策略就出來(lái)了:
先把整數(shù)轉(zhuǎn)換成字符串,然后比較a+b 和b+a,如果a+b>=b+a,就把a(bǔ) 排在b 的前
面,反之則把a(bǔ) 排在b 的后面。

#include//也不太難
#include
#include
using namespace std;
char s[1002],s1[1002],change[1002];
void charu(){
int a=atof(s);
int b=atof(s1);
int l=strlen(s);
int l1=strlen(s1);
if(apow(10,l1)+b>=bpow(10,l)+a) strcat(s,s1);
else{
strcpy(change,s);
strcpy(s,s1);
strcat(s,change);
}
}
int main(){
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s",s1);
if(i==1){
strcpy(s,s1);
continue;
}
charu();
}
printf("%s",s);
}

紀(jì)念品分組【NOIP2007】

時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB
題目描述
元旦快到了,校學(xué)生會(huì)讓樂(lè)樂(lè)負(fù)責(zé)新年晚會(huì)的紀(jì)念品發(fā)放工作。為使得參加晚會(huì)的同學(xué)所獲
得的紀(jì)念品價(jià)值相對(duì)均衡,他要把購(gòu)來(lái)的紀(jì)念品根據(jù)價(jià)格進(jìn)行分組,但每組最多只能包括兩
件紀(jì)念品, 并且每組紀(jì)念品的價(jià)格之和不能超過(guò)一個(gè)給定的整數(shù)。為了保證在盡量短的時(shí)
間內(nèi)發(fā)完所有紀(jì)念品,樂(lè)樂(lè)希望分組的數(shù)目最少。
你的任務(wù)是寫(xiě)一個(gè)程序,找出所有分組方案中分組數(shù)最少的一種,輸出最少的分組數(shù)目。
輸入
含n+2 行:
第1 行包括一個(gè)整數(shù)w,為每組紀(jì)念品價(jià)格之和的上限;
第2 行為一個(gè)整數(shù)n,表示購(gòu)來(lái)的紀(jì)念品的總件數(shù);
第3-n+2 行每行包含一個(gè)正整數(shù)Pi(5<=Pi<=w),表示所對(duì)應(yīng)紀(jì)念品的價(jià)格。
輸出
僅一行,包含一個(gè)整數(shù),即最少的分組數(shù)目。
樣例輸入
100
9 90
20
20
30
50
60
70
80
90
樣例輸出
6
提示
50%的數(shù)據(jù)滿足: 1<=n<=15
100%的數(shù)據(jù)滿足: 1<=n<=30000,80<=W<=200
解析:
題目要求每個(gè)組最多分兩個(gè)紀(jì)念品,如果是小的數(shù)字,那么它可能可以跟很多其他數(shù)字
組合,比如樣例:90 20 20 30 50 60 70 80 90,比如20 可以有很多的組合選擇;
但大的數(shù)字可以組合的機(jī)會(huì)比較少,比如90 沒(méi)的選擇,80 只能跟20 組合才不會(huì)超過(guò)100,
因此我們發(fā)現(xiàn)可以從較大數(shù)字優(yōu)先著手:
首先排序,當(dāng)前剩余數(shù)字中最大的數(shù)字如果能跟最小的數(shù)字組合,就讓它們分為一組,
否則最大數(shù)字單獨(dú)一組,并彈掉最大的數(shù)字,重復(fù)上述操作,直到數(shù)字取光,那么構(gòu)成的組
數(shù)即為答案。

#include //也也不太難
#include
#include
#include
using namespace std;
int main(){
int i,n,w,tot,a[30002],place=1;
scanf("%d%d",&w,&n);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
tot=n;
for(i=n;i>place;i–){
if(a[i]+a[place]<=w){
tot–;
place++;
}
}
printf("%d",tot);
}

零件分組

時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB
題目描述
某工廠生產(chǎn)一批棍裝零件,每個(gè)零件都有一定的長(zhǎng)度(li)和重量(wi).現(xiàn)在為了加工需
要,要將它們分成若干組,使每一組的零件都能排成一個(gè)長(zhǎng)度和重量都不下降(若i<j,則
li<=lj,wi<=wj)的序列。請(qǐng)問(wèn)至少要分成幾組。
輸入
第一行為一個(gè)整數(shù)n(n<=1000),表示零件的個(gè)數(shù)。第二行有n 對(duì)正整數(shù),每對(duì)正整數(shù)表示
這些零件的長(zhǎng)度和重量,長(zhǎng)度和重量均不超過(guò)10000。
輸出
僅一行,即最少分成的組數(shù)。
樣例輸入
58
4
3 8
2 3
9 7
3 5
樣例輸出
2
提示
二級(jí)排序
解析:
首先我們二級(jí)排序,那么問(wèn)題就只需要比較沒(méi)有排序的另一邊數(shù)據(jù),比如1 3 2 6 4
7 5,剛開(kāi)始1 就分成組1,元素為{1},當(dāng)3 來(lái)的時(shí)候,可以放到組1,就不額外增加組
了{(lán)1, 3}, 2 來(lái)的時(shí)候有分歧了,可以是{1,2} {3},也可以是{1,3} {2},那么我
們發(fā)現(xiàn)兩種情況其實(shí)效果一樣,因?yàn)槊總€(gè)分組在乎的是最后一個(gè)數(shù)字,那么我們?nèi)我膺x擇
{1,3}{2}的方案,因?yàn)檫@樣就不用調(diào)整3 了。再來(lái)6 的時(shí)候,我們發(fā)現(xiàn),6 接到3 后面
比較好,使得兩組末尾的數(shù)字變?yōu)閧6}{2},比{6}{3}要好。4 來(lái)的時(shí)候,接到2 后面,7
來(lái)的時(shí)候接6 后面,5 來(lái)的時(shí)候接4 后面,于是方案就為{1,3,6,7}{2,4,5}
這個(gè)時(shí)候貪心策略就自然出來(lái)了,也就是每個(gè)數(shù)字開(kāi)始,往后取數(shù)字,取比它大的接在
后面,比它小的先忽略,一直取到數(shù)列最后,構(gòu)成一個(gè)分組。接下來(lái)重新開(kāi)始選擇數(shù)字,構(gòu)
成第二個(gè)分組,直到數(shù)列中的元素取完。那么最終有多少組就是答案。

#include//這道題的本質(zhì)就是記錄最小值更新的次數(shù),我覺(jué)得我編的比題解要更好一些
#include
#include
#include
using namespace std;
int main(){
int n,l[1002],w[1002],i,min,judge=1,tot=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&l[i],&w[i]);
}
sort(l+1,l+1+n);
for(i=2;i<=n;i++){
if(judge){
if(w[i]<w[i-1]){
tot++;
judge=0;
min=w[i];
}//一開(kāi)始min相當(dāng)于w[i-1]
}
else{
if(w[i]<min) tot++;
}
}
printf("%d",tot);
}

總結(jié)

以上是生活随笔為你收集整理的日志:贪心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。