zoukankan      html  css  js  c++  java
  • Xenia and Divisors

    Xenia and Divisors
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Xenia the mathematician has a sequence consisting of n (n is divisible by 3) positive integers, each of them is at most 7. She wants to split the sequence into groups of three so that for each group of three a, b, c the following conditions held:

    • a < b < c;
    • a divides bb divides c.

    Naturally, Xenia wants each element of the sequence to belong to exactly one group of three. Thus, if the required partition exists, then it has  groups of three.

    Help Xenia, find the required partition or else say that it doesn't exist.

    Input

    The first line contains integer n (3 ≤ n ≤ 99999) — the number of elements in the sequence. The next line contains n positive integers, each of them is at most 7.

    It is guaranteed that n is divisible by 3.

    Output

    If the required partition exists, print  groups of three. Print each group as values of the elements it contains. You should print values in increasing order. Separate the groups and integers in groups by whitespaces. If there are multiple solutions, you can print any of them.

    If there is no solution, print -1.

    数据最大才7。。。因此只有三种情况:1 2 4,1 2 6和1 3 6.

     1 #include <iostream>
     2 #include <queue>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 int n, cnt[8], ans[3];
     8 
     9 bool deal(int v)
    10 {
    11     bool ok = true;
    12     switch(v){
    13     case 7:
    14     case 5:
    15         ok = !cnt[v];
    16         break;
    17     case 4:
    18         if(cnt[4] > cnt[2] || cnt[4] > cnt[1]) {
    19             ok = false;
    20             break;
    21         }
    22         cnt[2] -= cnt[4];
    23         cnt[1] -= cnt[4];
    24         ans[0] = cnt[4];
    25         break;
    26     case 6:
    27         if(cnt[6] != cnt[2] + cnt[3] || cnt[6] != cnt[1]){
    28             ok = false;
    29             break;
    30         }
    31         ans[1] = cnt[2];
    32         ans[2] = cnt[3];
    33         break;
    34     }
    35     return ok;
    36 }
    37 
    38 int main()
    39 {
    40     while(scanf("%d", &n) != EOF){
    41         memset(cnt, 0, sizeof(cnt));
    42         while(n--){
    43             int v;
    44             scanf("%d", &v);
    45             cnt[v]++;
    46         }
    47         bool ok;
    48         ok = deal(7) && deal(5) && deal(4) && deal(6);
    49         if(ok){
    50             while(ans[0]--){
    51                 puts("1 2 4");
    52             }
    53             while(ans[1]--){
    54                 puts("1 2 6");
    55             }
    56             while(ans[2]--){
    57                 puts("1 3 6");
    58             }
    59         }
    60         else{
    61             puts("-1");
    62         }
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    各类运算符练习
    用if语句把24小时制转换成12小时制
    Android课程---优化ListView列表视图
    Android课程---关于ListView列表视图的学习
    Android课程---时间日期对话框
    Android课程---关于对话框的学习
    Android课程---用进度条改变图片透明度
    Android课程---进度条及菜单的学习
    Android课程---final关键字
    Android课程---日历选择器和时间选择器
  • 原文地址:https://www.cnblogs.com/cszlg/p/3307989.html
Copyright © 2011-2022 走看看