C语言1094题目,P1094 (C语言代码)
解題思路:
砍成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
//用的是c,隨便排一下序...
void?sort(int?a[],int?len){
for(int?i=0;i
int?k=i;
for(int?j=i+1;j
if(a[k]
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
scanf("%d",&a[i]);
}
for(int?i=0;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
if(a[i]>b[j]){????//誰大誰先砍
comt+=a[i]*y;?//這里是乘以對面方向的塊數
i++;
x++;??????????//砍完一刀當然是數量增加啦
}else{
comt+=b[j]*x;
j++;
y++;
}
}
if(i==n-1){????????????//處理一下上面的尾款...
for(;j
comt+=b[j]*x;
y++;
}
}else{
for(;i
comt+=a[i]*y;
x++;
}
}
printf("%d",comt);
}
總結
以上是生活随笔為你收集整理的C语言1094题目,P1094 (C语言代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据文件5属于孤立,syst
- 下一篇: DOSbox安装使用教程和汇编工具