3 条题解
-
0
#include<stdio.h> int main(){ int n,m; scanf("%d %d",&n,&m); int i,j; int tot[50]; for(i=0;i<n;i++) { scanf("%d",&tot[i]); } //冒泡排序 for(i=0;i<n-1;i++) { for(j=0;j<n-1;j++) { if(tot[j]>tot[j+1]) { int temp=tot[j]; tot[j]=tot[j+1]; tot[j+1]=temp; } } } //水龙头归零 int water[50]; for(i=0;i<m;i++){ water[i]=0; } //贪心 int sum=0; int minsize; for(i=0;i<n;i++){ minsize=0; for(j=0;j<m;j++){ if(water[j]<water[minsize]){ minsize=j; } } water[minsize]+=tot[i]; sum+=water[minsize]; } printf("%d",sum); return 0; } -
0
这道题要用什么算法其实是写在标签里了,这个算法就叫贪心算法。贪心算法主要就是在每一步都找这一步最快的方法,也就是说,假如要先让一个人打水,得让打水最快的来,就能最快地走完这一步,然后第一个人就不用管了,后面的也是重复这个步骤。
不过,题目有个要读懂的点,总时间是什么意思?比如说,假设有3个人到一个水龙头打水,他们打水的时间分别是1, 2, 3(单位: min), 对于第一个打水的人来说要1(min),第二个打水的人来说要1 + 2 = 3(min),对于第三个打水的人来说要1 + 2 + 3 = 3 + 3 = 6(min)。总时间就是 1 + 3 + 6 = 10(min),当然,这也是最短的总打水时间。所以一个人需要的打水时间是 排队时间 + 自己的打水时间,总的打水时间就是 每个人需要的打水时间之和。
写成数学公式更容易看些:
下面是我的代码:
#include <stdio.h> #include <stdlib.h> int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int n, m; scanf("%d %d", &n, &m); int need_time[55] = {0}; for (int i = 0; i < n; i ++) { scanf("%d", &need_time[i]); } qsort(need_time, n, sizeof(int), compare); if (n > m) { for (int i = m; i < n; i ++) { need_time[i] += need_time[i - m]; } } int total_time = 0; for (int i = 0; i < n; i ++) { total_time += need_time[i]; } printf("%d", total_time); return 0; } -
0
显然应该是让快的人先打水以达到总时间最短的目的。
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void*a,const void*b){ return(*(int*)a-*(int*)b); } int main(){ int n,m,i,j; int duan; int zong=0; scanf("%d %d",&n,&m); int shijian[n]; int slt[m]; memset(shijian,0,sizeof(shijian)); memset(slt,0,sizeof(slt)); for(i=0;i<n;i++){ scanf("%d",&shijian[i]); } qsort(shijian,n,sizeof(int),cmp); for(i=0;i<n;i++){ duan=0; for(j=0;j<m;j++){ if(slt[j]<slt[duan]){ duan=j; } } zong+=slt[duan]+shijian[i]; slt[duan]+=shijian[i]; } printf("%d",zong); return 0; }
- 1
信息
- ID
- 18
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 1108
- 已通过
- 373
- 上传者