算法第四章上机实践报告
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,找到下一个最小合并的两个数)