算法第四章上机实践报告

1.

#include <iostream>
#include <algorithm>
using namespace std;
int n,L,l[2000],m=0;

 

void findmax(){
int restL=L;
int i=0;
while(i<n && restL>0){
if(restL>=l[i]){
m++;
restL=restL-l[i];
}
i++;
}
cout<<m;
}

 

int main(){
cin>>n>>L;
for(int i=0;i<n;i++){
cin>>l[i];
}
sort(l,l+n);
findmax();
return 0;
}
(一直找最大段数)
2、

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<vector>

#include<queue>

#include<stack>

#include<algorithm>

#include<math.h>

using namespace std;

typedef long long ll;

 

char num[1000], ans[1000], Min = '9' + 1;

int len, del, remain, Count = 0, Index = 0;

 

int main(){

scanf("%s", num);

scanf("%d", &del);

len = strlen(num);

remain = len - del;

if(remain == 0){

printf("0");

return 0;

}

while(remain > 0){

Min = '9' + 1;

for(int i = Index; i < len - remain + 1; ++i){

if(num[i] < Min){

Min = num[i];

Index = i;

}

}

ans[Count++] = Min;

--remain;

++Index;

}

ans[Count] = '\0'; 

int i = 0;

while(i < Count - 1 && ans[i] == '0') ++i;

printf("%s",ans + i);

return 0;

}

 3、

#include<iostream>
#include<algorithm>
using namespace std;
int k, a[2000], b[2000];

bool cmp(int &a, int &b){
return a > b;
}

void FindMax(){
int max = 0;
int temp = 0;
 
for(int i = 0; i < k - 1; i++){
temp += a[i];
max = max + temp +a[i+1]- 1;
}
 
cout << max;
}

void FindMin(){
int min = 0;
 
for(int i = 0; i < k - 1; i++){
sort(b + i , b + k);
b[i+1]=b[i]+b[i+1];
min = min + b[i+1] - 1;
}
 
cout << " " << min;
}


int main(){
cin >> k;
 
for(int i = 0; i < k; i++){
cin >> a[i];
}
 
for(int i = 0; i < k; i++){
b[i] = a[i];
}
 
sort(a, a + k, cmp);
FindMax();
sort(b, b + k);
FindMin();
 
return 0;
 
}
(贪心算法:找最大的数时,一直找最大两个数进行合并;找最小的数时,一直找最小的两个进行合并,一直sort然后再将合并的数进行sort,找到下一个最小合并的两个数)
posted on 2019-11-18 23:02  mars0604  阅读(198)  评论(0编辑  收藏  举报