生活随笔
收集整理的這篇文章主要介紹了
贪心相关的习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 問題 A: 看電視 【★★】
- 問題 B: 出租車費 【★】
- 問題 C:To Fill or Not to Fill 【★★★】
- 問題 D:修復墻壁
- 問題 E:胖子的貿易 【★】
- 問題 F: 迷瘴【★】
- 問題 G: 找零錢 【★★】思維很好的題
問題 A: 看電視 【★★】
http://codeup.cn/problem.php?cid=100000584&pid=0
思路: 區間貪心
#include<cstdio>
#include<algorithm>
using namespace std
;
struct student
{int left
;int right
;
}stu
[105];
bool cmp(student a
,student b
)
{if(a
.left
==b
.left
)return a
.right
<b
.right
;return a
.left
>b
.left
;
}
int main(void)
{int n
;int i
;while(1){scanf("%d",&n
);int number
=1;if(n
==0)return 0;for(i
=0;i
<n
;i
++){scanf("%d %d",&stu
[i
].left
,&stu
[i
].right
);}sort(stu
,stu
+n
,cmp
);int leftx
=stu
[0].left
;for(i
=1;i
<n
;i
++){if(leftx
>=stu
[i
].right
){number
++;leftx
=stu
[i
].left
;}}printf("%d\n",number
);}
}
問題 B: 出租車費 【★】
http://codeup.cn/problem.php?cid=100000584&pid=1
思路:
1~4 每公里 2.5
5~8 每公里 2
大于8 每公里 2.4
#include<cstdio>
int main(void)
{long int number
;double sum
;while(1){scanf("%d",&number
);if(number
==0)return 0;sum
=0;int flag
=0;if(number
<=4)sum
=10;if(number
<=8&&number
>4)sum
=10+(number
-4)*2; if(number
<12&&number
>8){sum
=18+(number
-8)*2.4;flag
=1;} if(number
>=12){sum
=(number
/8)*18;if((number
%8)<=4){sum
=sum
+(number
%8)*2.4;if(number
%8==0)flag
=0;elseflag
=1;}else{sum
=sum
+((number
%8)-4)*2+10;}}if(flag
)printf("%.1lf\n",sum
);elseprintf("%ld\n",(int)sum
);} return 0;
}
問題 C:To Fill or Not to Fill 【★★★】
http://codeup.cn/problem.php?cid=100000584&pid=2
摘自:https://blog.csdn.net/myRealization/article/details/80154726
思路
輸入的是:
油箱的最大容量
到終點的距離
每升油能跑多遠,
加油站的總數。
接下來是N行,
單位汽油價格, 這個站到杭州(原點)的距離
輸出是:
到達終點的話,輸出最少的錢
沒有到達終點的話 輸出最長的距離
本題我這里一共列舉了三種方法。
第一種是別人寫的。
第二種是網上找的和我自己寫的代碼思路差不多
第三種是我寫的思路感覺比較清晰,就是代碼太冗長了。
代碼一:
#include <cstdio>
#include <algorithm>
using namespace std
;
typedef struct gasStation
{double p
, d
, s
;
} gs
;
bool cmp(gs a
, gs b
) {return a
.d
< b
.d
;
}int main() {double C
, D
, Davg
; int n
; while (scanf("%lf%lf%lf%d", &C
, &D
, &Davg
, &n
) != EOF) {gs gstat
[n
+ 1];double maxl
= C
* Davg
; for (int i
= 0; i
< n
; i
++) {scanf("%lf%lf", &gstat
[i
].p
, &gstat
[i
].d
);}gstat
[n
].p
= 0; gstat
[n
].d
= D
;sort(gstat
, gstat
+ n
+ 1, cmp
);for (int i
= 1; i
<= n
; i
++) {gstat
[i
].s
= gstat
[i
].d
- gstat
[i
- 1].d
;}int flag
= 1;if (gstat
[0].d
> 0) {flag
= 0;printf("The maximum travel distance = 0.00\n");} else {for (int i
= 1; i
<= n
; i
++) {if (gstat
[i
].s
> maxl
) { flag
= 0;printf("The maximum travel distance = %.2f\n", gstat
[i
- 1].d
+ maxl
);break;}}}double cost
= 0, nowTank
= 0;int nowSta
= 0, signal
= 1; if (flag
) { for (int i
= 0; i
< n
; i
++) {if (i
!= nowSta
) continue;for (int j
= i
+ 1; j
<= n
&& (gstat
[j
].d
- gstat
[i
].d
) <= maxl
; j
++) {if (gstat
[j
].p
< gstat
[nowSta
].p
) {if (nowTank
< (gstat
[j
].d
- gstat
[nowSta
].d
) / Davg
) {cost
+= gstat
[nowSta
].p
* ((gstat
[j
].d
- gstat
[nowSta
].d
) / Davg
- nowTank
);nowTank
= 0;} else nowTank
-= (gstat
[j
].d
- gstat
[nowSta
].d
) / Davg
;nowSta
= j
;signal
= 1;break;} else signal
= 0;}if (!signal
) {cost
+= gstat
[i
].p
* (C
- nowTank
);nowTank
= C
- (gstat
[i
+ 1].s
/ Davg
);nowSta
++;}} printf("%.2f\n", cost
);}}return 0;
代碼二:
本代碼的思路就是,找到你可以到達的加油站中最便宜的。
再看找到的加油站的價錢和你當前的加油站的價錢哪個更便宜。
如果找到的加油站便宜的話就去那個加油站
否則就加滿油再去那個加油站
#include<cstdio>
#include<algorithm>
using namespace std
;
const int maxn
= 510;
const int INF
= 1000000000;
struct station
{double price
, dis
;
}st
[maxn
];
bool cmp(station a
, station b
)
{return a
.dis
< b
.dis
;
}
int main()
{int n
;double Cmax
, D
, Davg
;scanf("%lf%lf%lf%d", &Cmax
, &D
, &Davg
, &n
);for (int i
= 0; i
< n
; i
++){scanf("%lf%lf", &st
[i
].price
, &st
[i
].dis
);}st
[n
].price
= 0;st
[n
].dis
= D
;sort(st
, st
+ n
, cmp
);if (st
[0].dis
!= 0){printf("The maximum travel distance = 0.00\n");}else{int now
= 0;double ans
= 0, nowTank
= 0, MAX
= Cmax
*Davg
;while (now
< n
){int k
= -1;double priceMin
= INF
;for (int i
= now
+ 1; i
<= n
&&st
[i
].dis
- st
[now
].dis
<= MAX
; i
++){if (st
[i
].price
< priceMin
){priceMin
= st
[i
].price
;k
= i
;if (priceMin
< st
[now
].price
){break;}}}if (k
== -1)break;double need
= (st
[k
].dis
- st
[now
].dis
) / Davg
;if (priceMin
< st
[now
].price
){ans
+= (need
- nowTank
)*st
[now
].price
;nowTank
= 0;}else{ans
+= (Cmax
- nowTank
)*st
[now
].price
;nowTank
= Cmax
- need
;}now
= k
;}if (now
== n
){printf("%.2f\n", ans
);}else{printf("The maximum travel distance = %.2f\n", st
[now
].dis
+ MAX
);}}return 0;
}
代碼三:
我的思路就是先看可不可以到達。
可以的話就計算可以到達的最小價錢。
思路: 就是從我當前加油站為起點,找到我可以去的比我便宜的加油站 ,去那個加油站。
否則的話說明我現在所處的加油站就是最優的。那么加滿油去,可以到達的加油站中價錢最便宜的加油站。
#include<cstdio>
#include<algorithm>
using namespace std
;
struct gas
{double price
;double km
;
}g
[520];
bool cmp(gas a
,gas b
)
{return a
.km
<b
.km
;
}
int main(void)
{double max_oil
;double km
;double speed
;int n
;int i
;double maxkm
=0; bool flag
=true; double x
=0;scanf("%lf%lf%lf%d",&max_oil
,&km
,&speed
,&n
); maxkm
=max_oil
*speed
;for(i
=0;i
<n
;i
++){scanf("%lf%lf",&g
[i
].price
,&g
[i
].km
);}g
[n
].price
= 0;g
[n
].km
= km
;sort(g
,g
+n
,cmp
);if(g
[0].km
!=0){flag
=false;printf("The maximum travel distance = 0.00\n");return 0;}else{ for(i
=1;i
<n
;i
++){if(maxkm
< (g
[i
].km
-g
[i
-1].km
) ){x
=g
[i
-1].km
+maxkm
;flag
=false;break;}x
=g
[i
].km
;}if(i
==n
){if(maxkm
< ( km
-g
[n
-1].km
) ){flag
=false;x
=g
[n
-1].km
+maxkm
;}} }if(flag
){int now
=0;double now_oil
=0;double money
=0;while(now
<n
){int minPrice_index
=-1;double minPrice
=100000;for(i
=now
+1;i
<=n
&&(g
[i
].km
-g
[now
].km
)<=maxkm
;i
++){if(g
[i
].price
<minPrice
){minPrice
=g
[i
].price
;minPrice_index
=i
;if(minPrice
<g
[now
].price
)break;}}double need
=(g
[minPrice_index
].km
-g
[now
].km
)/speed
;if (minPrice
< g
[now
].price
){money
+= (need
- now_oil
)*g
[now
].price
;now_oil
= 0;}else{money
+= (max_oil
- now_oil
)*g
[now
].price
;now_oil
= max_oil
- need
;}now
= minPrice_index
;}printf("%.2lf\n",money
);}elseprintf("The maximum travel distance = %.2lf\n",x
);return 0;
}
問題 D:修復墻壁
http://codeup.cn/problem.php?cid=100000584&pid=3
思路: 排序后。按照大小依次拿直到滿足條件或拿完。
#include<cstdio>
#include<algorithm>
using namespace std
;
int a
[605];
int main(void)
{long int L
,N
;int i
;while( scanf("%ld %ld",&L
,&N
) != EOF ){int count
=0;long int sum
=0;for(i
=0;i
<N
;i
++){scanf("%d",&a
[i
]);}sort(a
,a
+N
);for(i
=N
-1;i
>=0;i
--){sum
=sum
+a
[i
];count
++;if(sum
>=L
)break;}if(sum
>=L
)printf("%d\n",count
);elseprintf("impossible\n");}return 0;
}
問題 E:胖子的貿易 【★】
http://codeup.cn/problem.php?cid=100000584&pid=4
思路: 按性價比排序。然后挨個換。
#include<cstdio>
#include<algorithm>
using namespace std
;
struct student
{int cat
;int java
;double score
;
}stu
[1005];
bool cmp(student a
,student b
)
{return a
.score
<b
.score
;
}
int main(void)
{int M
,n
;int i
;double sum
=0;while(1){scanf("%d %d",&M
,&n
);if(M
==-1)return 0;sum
=0;for(i
=0;i
<n
;i
++){scanf("%d %d",&stu
[i
].cat
,&stu
[i
].java
);stu
[i
].score
=stu
[i
].cat
/(double)stu
[i
].java
;}sort(stu
,stu
+n
,cmp
);for(i
=n
-1;i
>=0;i
--){if(M
<=stu
[i
].java
){break;}else{sum
=sum
+stu
[i
].cat
;M
=M
-stu
[i
].java
;}}printf("%.3lf\n",sum
+M
*stu
[i
].score
);}
}
問題 F: 迷瘴【★】
http://codeup.cn/problem.php?cid=100000584&pid=5
思路:
溶質 / 體積 = 濃度
溶質 = 體積 * 濃度
濃度越小,說明需要的體積越大。
故先按濃度從小到大排序。
再依次選擇
#include<cstdio>
#include<algorithm>
using namespace std
;
int main(void)
{int c
;int n
,v
,w
;int i
,j
;double m
;double m1
;int T
;while(scanf("%d",&c
) != EOF){for(i
=0;i
<c
;i
++){int a
[105]={0};m
=0.0;T
=0;scanf("%d%d%d",&n
,&v
,&w
);for(j
=0;j
<n
;j
++){scanf("%d",&a
[j
]);} sort(a
,a
+n
);for(j
=0;j
<n
;j
++){m1
=(m
*T
+a
[j
]*v
) / (T
+v
);if(m1
<=w
){T
=v
+T
;m
=m1
;} elsebreak;}if (!T
) printf("0 0.00\n");else printf("%d %.2lf\n", T
, m
/ 100); }}return 0;
}
問題 G: 找零錢 【★★】思維很好的題
http://codeup.cn/problem.php?cid=100000584&pid=6
#include<cstdio>
int money
[5]={50,20,10,5,1};
int main(void)
{int n
;int i
;int m
;int sum
;while( scanf("%d",&n
) != EOF ){int hush
[51]={0};for(i
=0;i
<5;i
++){hush
[ money
[i
] ]=n
/money
[i
];n
=n
%money
[i
];if( hush
[ money
[i
] ] !=0 ){if(n
!=0)printf("%d*%d+",money
[i
],hush
[money
[i
]]);elseprintf("%d*%d\n",money
[i
],hush
[money
[i
]]);}}}
}
總結
以上是生活随笔為你收集整理的贪心相关的习题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。