zoukankan      html  css  js  c++  java
  • poj1702

    题意:给定20个砝码,分别为3^i(i=0~19)。给定一个物品,放在天平左盘,左右皆可放砝码,如何放能平衡。

    分析:先将给定物品的重量化为3进制。我们要让两端平衡,即让两端的三进制数各位相等,每个砝码是3进制某一位上的一个1。我们需要在左盘某些位加1(即向左盘加对应砝码),使得与原物品的重量之和化为3进制后各位都不为2,然后在右盘现在全为0,可直接将某些位变为1(即向右盘加对应砝码)凑出左盘的只有0和1的3进制数。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;

    #define maxn 25

    int n;
    int f[maxn];
    bool l[maxn], r[maxn];
    int ans[maxn];

    void print(bool x[])
    {
    bool first = true;
    for (int i = 0; i < maxn; i++)
    if (x[i])
    {
    if (first)
    first
    = false;
    else
    putchar(
    ',');
    printf(
    "%d", ans[i]);
    }
    if (first)
    printf(
    "empty");
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    ans[0] = 1;
    for (int i = 1; i <= 19; i++)
    ans[i]
    = ans[i - 1] * 3;
    int t;
    scanf(
    "%d", &t);
    while (t--)
    {
    int x;
    scanf(
    "%d", &x);
    n
    = 0;
    memset(f,
    0, sizeof(f));
    while (x > 0)
    {
    f[n
    ++] = x % 3;
    x
    /= 3;
    }
    memset(l,
    0, sizeof(l));
    memset(r,
    0, sizeof(r));
    int j = 0;
    for (int i = 0; i < maxn; i++)
    {
    int x = f[i] + j;
    if (x < 2)
    {
    f[i]
    = x;
    r[i]
    = x;
    j
    = 0;
    continue;
    }
    else
    {
    l[i]
    = (x == 2);
    f[i]
    = 0;
    j
    = 1;
    }
    }
    print(l);
    putchar(
    ' ');
    print(r);
    putchar(
    '\n');
    }
    return 0;
    }
  • 相关阅读:
    传中文参数问题
    关于showModalDialog()弹出窗口.更改了页面的数据,再次点击页面却没有刷新
    ListView 中的一个低级 BUG
    Oracle SQLCODE/SQLERRM
    IE框架中访问不同域的网页遇到的问题
    JS代码收藏大全
    2006年终总结
    看来,你想成为一名DBA……
    将ViewState持久化保持在服务器端
    oraclemerge用法详解
  • 原文地址:https://www.cnblogs.com/rainydays/p/2147067.html
Copyright © 2011-2022 走看看