貪欲素朴な疑問
ボートをモデル化
ボートは、特定のサイズの一般的なモデルであり、そして二人だけを取ることができます。
アイデアは、あなたが最大値と最小値を見つけるまで前進小規模から大規模まで、データをソートして、最小から開始し、その後、最大音量に等しい未満かどうかを確認するために、最小と最大の合計値、最大範囲、することです値と条件を満たす
次のデータの最大値が1隻のボートを所有することができることを
複数のデータセット、データの各セットは、N + 1から成り行、入力の最初の行のN、M、Nの数であるが、mが船の最大荷重であり、その後、N品質の加害、各川はわずか2人を取ることができます、必要な最小限の船を求めて
テンプレート1
我的思路,构建左边界,右边界,数据递增,进行查找,但十分麻烦
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
int gr[100005];
for(int i=0;i<n;i++){
scanf("%d",&gr[i]);
}
sort(gr,gr+n);
int sum=0;
int left=0;
int right=n-1;
int lastright=n-1;
while(left<right){
while(gr[left]+gr[right]>m){
//当数据只剩下两个,且相加和大于4且第一个数据和两倍大于4时,会无故加一,所以要加上以下代码,表明筛选过头了
if(right==left)break;
right--;
}
sum++;
sum+=lastright-right;//最小值-匹配到的最大值的后面的数据
left++;
right--;
lastright=right;//及时更新上一个right
}
if(left==right){
sum++;
}
//putchar('\n');
printf("%d\n",sum);
}
return 0;
}
良いアイデアは以下のとおりです。
テンプレート2
多くの人がモデルを取ります
iが最大値で動作することができ、増加するためにので、配列インデックスを下げるアイデアの比較的単純なモデルを構築するが、ときに前の最小値と、第1の最大ビットを除去し、最小値を変更することはできないが、iの値増加します
//多人乘坐模型
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
bool cmp(int a,int b){
return a>b;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int g[maxn];
for(int i=0;i<n;i++){
scanf("%d",&g[i]);
}
sort(g,g+n,cmp);
int times=0;
for(int i=0;i<n;i++){
int sum=g[i]+g[n-1];
if(sum<=4){
n--;//最后一个数,即最小值不需要了,已经和最大值一起取坐车了
times++;
while(sum+g[n-1]<=4){//出现一辆车做多个人的情况
n--;//倒数第二个也不要了
sum+=g[n-1];
}
}else{
times++;//取最大值单独坐车
}
// printf("%d %d\n",i,n-1);
}
printf("%d\n",times);
}
return 0;
}