zoukankan      html  css  js  c++  java
  • 百练OJ 1017 2801

    一、1017填箱子

         这个题题目读起来有些晦涩,如果按题目给的条件很难找到突破口,需要事先计算一下每种CP(产品)在没装满的情况下还需要的其他CP数。(这个地方凭主观判断不出来,需要适当推一下),以下是AC的代码。

     1 /*        将一个6*6的包裹填满
     2  *        关键是计算出每个包裹中需要的产品数,在写程序,避免程序的冗余复杂
     3  *        分析:6*6的产品会占用一个箱子,
     4  *              5*5的CP填满箱子还需11个1*1的CP,
     5  *              4*4的CP填满还需5个2*2的CP,
     6  *              3*3的CP填满分情况:i.4的倍数刚好填满,ii.4的倍数多1,多出的一个重新分配一个箱子,
     7  *              则还需5个2*2的CP和7个1*1的CP,iii.4的倍数加2,多出的2个重新分配一个箱子,则需3个
     8  *              2*2的CP,6个1*1的CP,iiii.4的倍数多3,多出的3个重新分配一个箱子,则需1个2*2的CP,
     9  *              5个1*1的CP,用arrayCP2*2[4] = {0,5,3,1}表示3*3CP需要2*2的CP的数量,
    10  *              2*2的CP填满即可,多出来在重新加一个箱子
    11  *              1*1的CP也和2*2的CP类似
    12  */
    13 
    14 #include <iostream>
    15 using namespace std;
    16 
    17 int main()
    18 {
    19     int a,b,c,d,e,f;                //a,b,c,d,e,f分别表示各类型的CP的数量
    20     int BoxN;                       //箱子的数量
    21     int arrayCP2[4] = {0,5,3,1};
    22     int X1,X2;                      //分别表是需要1*1CP,2*2CP的空位
    23     while (1){
    24     cin >> a >> b >> c >> d >> e >> f;
    25     if (0 == a && 0 == b && 0 == c && 0 == d && 0 == e && 0 == f) 
    26         break;
    27     BoxN = f + e + d + (c + 3)/4;
    28 
    29     /*    这里是一个小小的规律:(c+3)/4表示2*2的CP/4取上整
    30      *  一件CP需要一个箱子,4件CP需要一个箱子,5件CP需要两个箱子
    31      *    依次,很经典!!学会用,这就是数学的魅力,下面的也一样
    32      */
    33 
    34     X2 = 5 * d + arrayCP2[c % 4];     //每个4*4的箱子需要5个,3*3的箱子按规律需要
    35     if ((b - X2) > 0)             //还有剩余
    36         BoxN += (b - X2 + 8)/9;   //同上,需要2*2的箱子数
    37     X1 = BoxN * 36 - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;  //总数减去所有被其他CP占用的就是1*1CP的数量
    38     if ((a - X1) > 0)
    39         BoxN += (a - X1 + 35)/36; //需要1*1的箱子数
    40     cout << BoxN <<endl;
    41     }
    42     return 0;
    43 }

    二、2801填词

          这个题容易把题目理解偏了,题目有一句话要求:“填入保证填词游戏至少有一组答案”,所以,就想方设法找单词的填法,另外一个问题:数组要尽量按题目要求开大一点。

     1 /*      填词
     2  *      这个很容易去计算各个单词所在的位置,这样很容易出错
     3  *      创建一个有26个字符的字符数组
     4  */
     5 #include <iostream>
     6 #include <cstdio>
     7 #include <cstring>
     8 using namespace std;
     9 
    10 int const MaxM = 101;
    11 int const MaxN = 10;
    12 int const MaxLength = 1001;
    13 char words[MaxN][MaxM];
    14 char str[MaxLength];
    15 int characters[26];
    16 
    17 void ResetCharacters (int n);
    18 void ResetCharactersNow (int n);
    19 
    20 int main()
    21 {
    22     int n,m,p;
    23     memset(characters,0,sizeof(int));
    24     cin >> n >> m >> p;
    25     ResetCharacters(n);
    26     ResetCharactersNow(p);
    27     for (int i = 0; i != 26; ++i){
    28         if (characters[i] != 0){
    29             for(int j = 0; j != characters[i]; ++j)
    30                 printf("%c",i + 'A');
    31         }
    32     }
    33     cout<<endl;
    34     return 0;
    35 }
    36 
    37 
    38 void ResetCharacters(int n)      //用数组存储的方法
    39 {
    40     for (int i = 0; i != n; ++i)
    41         cin >> words[i];
    42     for (int i = 0; i != n; ++i){
    43         for (int j = 0; words[i][j] != '\0'; ++j)
    44             characters[words[i][j] - 'A'] ++; 
    45     }
    46 }
    47 // void ResetCharacters(int n)         //这是另外一种方法,用字符串
    48 // {
    49 //     char s[11];
    50 //     for (int i = 0; i!= n; ++i){
    51 //         cin >> s;
    52 //         for (int j = 0; s[j] != '\0'; ++j)
    53 //             characters[s[j] - 'A'] ++; 
    54 //     }
    55 // }
    56 
    57 void ResetCharactersNow(int n)
    58 {
    59     for (int i = 0; i != n; ++i){
    60         cin >> str;
    61         for (int i = 0; str[i] != '\0'; ++i)
    62             characters[str[i] - 'A']--;
    63     }
    64 }

    个人总结:想问题要灵活,千万不要死脑筋。

    stay hungry stay foolish ----jobs 希望多多烧香!
  • 相关阅读:
    【随手记】常用16进制代表的容量或位置
    精通css——position属性
    Ubuntu安装GitLab
    Linux内核
    分布式(一)——分布式系统的特性
    【树莓派】入门
    Intel CPU发展历史
    C++读mnist数据
    实验代码一:用来链表实现单向图
    Hadoop配置+centos6.5
  • 原文地址:https://www.cnblogs.com/bakari/p/2627742.html
Copyright © 2011-2022 走看看