搜狐第二题,使用最蠢的办法,一个一个算。求简单的解法

import java.util.Scanner;

/**
 * Created by author on 2017/8/28.
 */
public class Main {
   
public static void main(String[] args) {
       
Scanner in = new Scanner(System.in);
       
int[] a = new int[6];
       
while (in.hasNext()) {
           
for (int i = 0; i < 6; i++) {
               
a[i] = in.nextInt();
            }
           
int i = 0;
           
for (i = 0; i < 6; i++) {
               
if (a[i] != 0)
                   
break;
            }
           
if (i == 6)
               
break;
           
int ans = 0;
           
if (a[5] != 0)
               
ans += a[5];
           
if (a[4] != 0) {
               
ans += a[4];
               
if (a[0] > a[4] * 11)
                    
a[0] -= a[4] * 11;
               
else
                   
a[0] = 0;
            }
           
if (a[3] != 0) {
               
ans += a[3];
               
if (a[1] > 5 * a[3]) {
                   
a[1] -= 5 * a[3];
                }
else {
                    
if (a[0] > 4 * (5 * a[3] - a[1])) {
                       
a[0] -= 4 * (5 * a[3] - a[1]);
                    }
else
                       
a[0] = 0;
                   
a[1] = 0;
                }
            }
           
if (a[2] != 0) {
               
ans += a[2] / 4;
               
a[2] = a[2] % 4;
               
if (a[2] != 0)
                   
ans += 1;
               
if (a[2] == 1) {
                   
if (a[1] > 5) {
                       
a[1] -= 5;
                    }
else {
                       
if (a[0] > 4 * (5 - a[1]) + 7) {
                           
a[0] -= 4 * (5 - a[1]) + 7;
                        }
else
                           
a[0] = 0;
                       
a[1] = 0;
                    }
                }
               
if (a[2] == 2) {
                   
if (a[1] > 3) {
                       
a[1] -= 3;
                    }
else {
                       
if (a[0] > 4 * (3 - a[1]) + 6) {
                           
a[0] -= 4 * (3 - a[1]) + 6;
                        }
else
                           
a[0] = 0;
                       
a[1] = 0;
                    }
                }
               
if (a[2] == 3) {
                   
if (a[1] > 1) {
                       
a[1] -= 1;
                    }
else {
                       
if (a[0] > 4 * (1 - a[1]) + 5) {
                           
a[0] -= 4 * (1 - a[1]) + 5;
                        }
else
                           
a[0] = 0;
                       
a[1] = 0;
                    }
                }
            }

           
if (a[1] != 0) {
               
ans += a[1] / 9;
               
a[1] = a[1] % 9;
               
if (a[1] != 0) {
                   
ans += 1;
                }
               
if (a[0] > 36 - a[1] * 4) {
                    
a[0] -= 36 - a[1] * 4;
                }
else
                   
a[0] = 0;
            }
           
if (a[0] != 0) {
               
ans += a[0] / 36;
               
a[0] = a[0] % 36;
               
if (a[0] != 0)
                   
ans++;
            }
           
System.out.println(ans);
        }
    }
}
全部评论
给个我认为优雅实现的思路。 6*6、5*5、4*4、3*3一旦出现肯定会占用一个箱子。 2*2、1*1作为基本的单位。 6*6 不需要额外处理 5*5 扣除11个1*1 4*4 扣除5个2*2 3*3 分情况   1个3*3 扣除5个2*2和7个1*1  2个3*3 扣除3个2*2和6个1*1  3个3*3 扣除1个2*2和5个1*1   注意这里有个技巧,1*1的个数和2*2的个数可以扣到负数。 如果1*1和2*2都为负数 直接输出结果 如果2*2为负数 1*1为正数,那么1*1去补偿2*2以后再计算1*1所要占用的箱子。 如果都为正数,那么先处理完2*2再处理1*1。
点赞 回复 分享
发布于 2017-08-28 20:55
ac了??
点赞 回复 分享
发布于 2017-08-28 20:42
这反而是最快的。。。
点赞 回复 分享
发布于 2017-08-28 20:45
w我擦。。。
点赞 回复 分享
发布于 2017-08-28 20:45
牛逼!
点赞 回复 分享
发布于 2017-08-28 20:46
这能ac吗
点赞 回复 分享
发布于 2017-08-28 20:49
也是这么做的,可是最后把自己搞晕了
点赞 回复 分享
发布于 2017-08-28 21:02
我这是这么做的,AC😂😂😂
点赞 回复 分享
发布于 2017-08-28 21:33
#include <bits/stdc++.h> using namespace std; // 放完3*3 后还能放多少2*2 int num[] = {0,5,3,1}; int least(const vector<int> &arr) { // 放完大的,至少需多少个 int ans = arr[5]+arr[4]+arr[3]+(arr[2]+3)/2; // 不增加包装箱的前提下,还能放多少2*2 int a2 = 5*arr[3] + num[arr[2]%4]; // 如果依然没有放完2*2,需要申请新的包装箱 if (arr[1]>a2) ans += (arr[1]-a2+8)/9; // 不增加包装箱的前提下,还能放多少1*1 int a1 = ans*36-36*arr[5]-25*arr[4]-16*arr[3]-9*arr[2]-4*arr[1]; // 如果依然没有放完1*1,需要申请新的包装箱 if (arr[0]>a1) ans += (arr[0]-a1+35)/36; return ans; } int main() { vector<vector<int>> matrix; int tmp,total=0; do{ total = 0; vector<int> arr; for (int i=0; i<6; i++) { cin>>tmp; total+=tmp; arr.push_back(tmp); } if (total!=0) matrix.push_back(arr); }while(total!=0); for (auto ele : matrix) { cout<<least(ele)<<endl; } return 0; }
点赞 回复 分享
发布于 2017-08-28 21:53

相关推荐

暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务