解题思路:
砍成1X1的单位方块,需要 n*m-1 刀。
如果说,横、纵方向的每一刀的代价都一样的话。那很简单,n方向最少砍n-1刀,同理m方向最少要砍m-1刀,(自己画图看看)。那么剩余的那几刀分给代价最少的去砍,
min=(n-1)*n的代价+(m-1)*m的代价+(n*m-n-m+2)*两者最小的代价
当然,题目没有那么简单,它每一刀的代价可能都不同
我的思路是这样子的:
1.一刀两断,x方向砍了第一刀,如果y方向要砍,那么y要砍两刀,代价*2。当然同x方向不用
2.既然是这样,那么代价高的就要少砍一些
3.完毕!
注意事项:
注意看题目,我相信很多人和我一样,以为只有4个输入。认真审题!每一刀它都可能会给你一个不一样的代价,输入案例真的有点坑人 2 2 3 3....
参考代码:
#include<stdio.h> //用的是c,随便排一下序... void sort(int a[],int len){ for(int i=0;i<len-1;i++){ int k=i; for(int j=i+1;j<len;j++){ if(a[k]<a[j]){ k=j; } } if(k!=i){ a[i]=a[i]^a[k]; a[k]=a[i]^a[k]; a[i]=a[i]^a[k]; } } } int main() { int n,m; scanf("%d%d",&n,&m); if(n==1&&m==1){ printf("0"); return 0; } int a[2000],b[2000]; for(int i=0;i<n-1;i++){ scanf("%d",&a[i]); } for(int i=0;i<m-1;i++){ scanf("%d",&b[i]); } //对两个方向的代价排一下序 sort(a,n-1); sort(b,m-1); int i=0,j=0; //用于记录a,b数组的下标 int comt=0; //总代价 int x=1,y=1; //两个方向砍出来的木板数量 while(i<n-1&&j<m-1){ if(a[i]>b[j]){ //谁大谁先砍 comt+=a[i]*y; //这里是乘以对面方向的块数 i++; x++; //砍完一刀当然是数量增加啦 }else{ comt+=b[j]*x; j++; y++; } } if(i==n-1){ //处理一下上面的尾款... for(;j<m-1;j++){ comt+=b[j]*x; y++; } }else{ for(;i<n-1;i++){ comt+=a[i]*y; x++; } } printf("%d",comt); }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复