解题思路:

注意事项:

此解法并不能100分,只能89分,原因不太清楚可能是值域的问题,希望有大佬指出问题


参考代码:


参考代码:
#include<stdio.h>
int arr[100][1000] = { 0 };       //定义一个二维数组存放杯子,其实一维数组也可以
int n, k;               //依据题目定义,n代表杯子数量,k代表组别(几种颜色)
int judge(int& num) {         //判断函数,判断数值num是否为最小值
for (int i = 0; i < k; i++) {     //遍历每一种颜色
int sum = 0;  //sum水总和(类似水库)
for (int j = 0; arr[i][j] != 0; j++) {   //遍历同种颜色中的所有杯子
if (arr[i][j] > num) {     //某i色杯子的水量大于假定值num
sum += arr[i][j] - num;     //将大于num的部分存入sum(水库)
}
else if(arr[i][j] < num) {  //某i色杯子的水量小于假定值num
sum -= num - arr[i][j];//将sum的水给予该杯子
}
}
if (sum < 0) {   //某i色杯子循环结束后如sum小于0,则代表水不够用,假定值num过高,返回1
return -1;
}
}
return 0; //够用,返回0
}

int l = 0,r=100000;  //二分查找的最左值(l),最右值(r)
int main()
{
scanf("%d %d",&n,&k);    //输入n与k
int u = 0, y = 0;
for (int i=1; i <= n; i++) {    //n个杯子遍历n遍
scanf("%d", &arr[u][y]);    //输入单杯水量
u++;  
if (i % k == 0) {  //第i杯为k的倍数则进入新一轮从第一种颜色开始输入水量
u=0;
y++;
}
}
int mid = (r + l) / 2;  //mid中间值
while(l<r) {   
if (judge(mid) == -1) {
r = mid-1;  
mid = (r + l+1) / 2;
}
if (judge(mid) == 0) {
l = mid;
mid = (r + l+1) / 2;
}
}
printf("%d", l);
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论