nyoj 602 wwwater

来源:互联网 发布:淘宝死神ps3 编辑:程序博客网 时间:2024/05/18 00:43

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=602

首先是处理用手掰的,最先处理的是边小的,全部切成min个1*mid*max,再就是处理不大不小的那条边了,全部切成min*mid个1*1*max的,最后处理最大的边,切成min*Mid*max个1*1*1的,现在只需要确定每次所需要的刀数就好了。

再就是处理刀切的,显然这个只需要对半切,无法对半切的单独切一次。


代码如下:


#include<iostream>#include<math.h>#include<stdio.h>using namespace std;long b[1000000];void gou(){long value=1;for(int i=1;i<20;i++){value*=2;b[i]=value;}}int cha (int m){b[0]=1;for(int i=0;i<100000;i++){if(b[i]==m)return i;if(b[i]>m)return i;}}long long  one(int n, int m,int  k){int a[4]={n,m,k};int Max=-1000;int Min=10000000;for(int i=0;i<3;i++){if(a[i]>Max)Max=a[i];if(a[i]<Min)Min=a[i];}long long Mid=n+m+k-Max-Min;long long  value=(long long )((Min-1)+(Min*(Mid-1))+(long long)(Min*Mid*(Max-1)));return value;}int more(int n,int m,int k){int value=0;int _n=cha(n);int _m=cha(m);int _k=cha(k);value=_n+_m+_k;return value;}int main(){long t,n,m,k,i;gou();cin>>t;int temp=t;while(t--){cin>>n>>m>>k;printf("Case #%d: %lld %d\n",temp-t,one(n,m,k),more(n,m,k));}return 0;}


原创粉丝点击