zoukankan      html  css  js  c++  java
  • POJ Sticks1011解题报告

     1 //Sticks1011 By XieJiang 20170417
     2 /**
     3 *0.最小木棍的长度一定小于等于所有木棍长度之和,大于等于输入的最长的木棍
     4 *1.当Sticks[i]可用时,而Sticks[i-1]不可用且Sticks[i-1]=Sticks[i],Sticks[i]不可用,在DFS的过程中,
     5     如果当前木棒和前一个木棒长度相等,并且前一根木棒没有被使用,这说明此种长度的木棒不在此次遍历的解中,因此直接跳过
     6 *2.当组成木棒时,从大到小选取
     7 *3.组成木棒时,如果第一个选取的木棒不合适,就直接退出,表示整个木棒集合不合适
     8 *4.最终求出的木棒长度一定是总的木棒长的约数
     9 */
    10 #include <iostream>
    11 #include <algorithm>
    12 using namespace std;
    13 int gSum, gGoal, gN;
    14 int gSticks[65], gUsed[65];
    15 //归并排序,将输入数据按照从大到小的顺序排序
    16 void MegSort(int A[], int T[], int left, int right){
    17     int i, j, k, mid = (left + right) / 2;
    18     if (left == right)return;
    19     MegSort(A, T, left, mid);
    20     MegSort(A, T, mid + 1, right);
    21     for (i = mid; i >= left; i--)
    22         T[i] = A[i];
    23     for (j = 1; j <= right - mid; j++)
    24         T[right - j + 1] = A[j + mid];
    25     for (i = left, j = right, k = left; k <= right; k++){
    26         if (T[j] <= T[i])
    27             A[k] = T[i++];
    28         else
    29             A[k] = T[j--];
    30     }
    31 }
    32 //深度搜索,找出将木棒进行配对:当前木棒已经配比的长度,木棒使用到的位置,已经配好的木棒数
    33 bool DFS(int tCur, int tIndex, int tNum){
    34     if (gGoal * tNum == gSum) return true;
    35     int mi;
    36     for (mi = tIndex; mi < gN; mi++){
    37         if (mi && (gSticks[mi] == gSticks[mi - 1]) && (!gUsed[mi - 1])) continue;//1
    38         if (gUsed[mi]) continue;//如果已经被使用,则不再使用
    39         if (gSticks[mi] + tCur > gGoal)   continue;
    40         gUsed[mi] = 1;
    41         if (tCur + gSticks[mi] == gGoal){//当前这根木棒配完了
    42             if (DFS(0, 0, tNum + 1))//搭配剩下的木棒
    43                 return true;
    44             gUsed[mi] = 0;
    45             return false;
    46         }
    47         if (DFS(tCur + gSticks[mi], mi + 1, tNum))
    48                 return true;
    49         else{
    50             gUsed[mi] = 0;
    51             if (tCur == 0)
    52                 return false;//3
    53         }
    54     }
    55     return false;
    56 };
    57 int main(){
    58     int i;
    59     cin >> gN;
    60     while (gN > 0){
    61         gSum = 0; gGoal = 0;
    62         for (i = 0; i < gN; i++){
    63             cin >> gSticks[i]; gUsed[i] = gSticks[i];
    64             gSum += gSticks[i];
    65         }
    66         MegSort(gSticks, gUsed, 0, gN - 1);
    67         memset(gUsed, 0, sizeof(gUsed));
    68         for (gGoal = gSticks[0]; gGoal <= gSum; gGoal++){//0 2
    69             if (gSum % gGoal != 0)//4
    70                 continue;
    71             memset(gUsed, 0, sizeof(gUsed));
    72             if (DFS(0, 0, 0)){
    73                 cout << gGoal << endl;
    74                 break;
    75             }
    76         }
    77         cin >> gN;
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    unity c# 获取系统时间
    如果你想让继承MonoBehaviour的类变成Singleten
    关于程序员
    开始养成记录的习惯吧
    关于结构体的赋值问题
    数学中的集合,群,环,域
    励志
    [编程题] 进制均值
    javaEE 入门
    jsp内置对象2
  • 原文地址:https://www.cnblogs.com/1996313xjf/p/6725756.html
Copyright © 2011-2022 走看看