記事のディレクトリ
1.シンプルな欲張り
現在の状態で局所最適解を考えてみましょう
あなたがもっともらしい戦略を考えるならば、彼らはカウンターではない例として、そして勇敢にそれを達成することができます
ナップザック問題に類似PAT B1020月餅
#include<stdio.h>
#include<algorithm>
using namespace std;
struct mooncake{
double store;
double sell;
double price;
}cake[1010];
bool cmp(mooncake a,mooncake b){
return a.price > b.price;
}
int main(){
int n;
double D;
scanf("%d%lf",&n,&D);
for(int i = 0;i<n;i++)
scanf("%lf",&cake[i].store);
for(int i = 0;i<n;i++){
scanf("%lf",&cake[i].sell);
cake[i].price = cake[i].sell/cake[i].store;
}
sort(cake,cake+n,cmp);
double ans = 0;
for(int i = 0;i<n;i++){
if(cake[i].store<=D){
D-=cake[i].store;
ans+=cake[i].sell;
} else{
ans+= cake[i].price*D;
break;
}
}
printf("%.2f",ans);
return 0;
}
== PAT B1023 ==が最小数に設定
任意の順序で各番号0-9に与えられ、これらの番号を、最終的な目的は、可能な最小数得ることであるように、すべての使用、(0が最初ではない)必要があり
、入力10非負整数、順序は、0が持っている番号、番号1 ...... 9桁、50未満10の総数の数を表すの少なくとも1つの非0番号有する
サンプル入力:220003 0010
サンプル出力:10015558
#include<stdio.h>
int main(){
int count[10];
for(int i = 0;i<10;i++)
scanf("%d",&count[i]);
for(int i = 1;i<10;i++){
if(count[i]>0){
printf("%d",i);
count[i]--;
break;
}
}
for(int i = 0;i<10;i++)
for(int j = 0;j<count[i];j++)
printf("%d",i);
return 0;
}
2.貪欲間隔
間隔互いに素問題:開区間(x、y)のN数を考えると、実際にはよりオープンな間隔を選択することができ、このようなオープン間隔二十から二ことは交差点、例えば(1,3)として(2,4)(3,5 3個までは(1,3)(3,5)(6,7)が相互に互いに素で間隔を選択してもよい)、(6,7)、
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct Inteval{
int x,y;
}I[maxn];
bool cmp(Inteval a,Inteval b){
if(a.x != b.x) return a.x < b.x; //左端点从小到大排列
else return a.y < b.y; //左端点相同则按右端点从小到大
}
int main(){
int n;
while(scanf("%d",&n),n!=0){
int a[n] = {1,0};
for(int i = 0;i<n;i++){
scanf("%d%d",&I[i].x,&I[i].y);
}
sort(I,I+n,cmp);
int ans = 1,lastY = I[0].y;
for(int i = 1;i<n;i++){
if(I[i].x>=lastY){
a[i] += 1;
lastY = I[i].y;
ans++;
}
}
printf("%d\n",ans);
for(int i = 0;i<n;i++){
if(a[i]>0)
printf("(%d,%d)\n",I[i].x,I[i].y);
}
}
return 0;
}