原题链接:蓝桥杯2025年第十六届省赛真题-倒水
解题思路:
注意事项:
此解法并不能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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复