您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

【枚举算法】一些例题

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n;
    cin >> n;
    int i, j, k, l;
    for (i = 2; i <= n; i++)
    {
        for (j = 0; j <= i-1; j++)
        {
            for (k = 0; k < j-1; k++)
            {
                for (l = 0; l < k-1; l++)
                {

                    if (i * i* i == j * j * j + k * k * k + l * l * l)
                    {
                        cout << i << "^3  " << " = " << j << "^3   + " << k << "^3   + " << l << "^3  " << endl;
                    }

                }
            }
        }
    }
}


/*
      解题思路:
      四重循环,abcd,枚举算法
      a设置范围【2,n】b设为【2,a-1】以此类推
      从大到小还是从小到大试取决于输出
*/


#include <cstdio>
#include <iostream>

int main()
{
    int p=23, e=28, i=33, d=0;
    int k;
    int flag = 1;
    printf("输入天\n");
    scanf_s("%d", &d);
    for (k = d; k < 21252; k++)
    {

        if(((k - p) % 23 == 0) && ((k - e) % 28 == 0) && ((k - i) % 33 == 0))
        {
            printf("下一天为:%d ", k-d );
            flag = 0;
        }
    }
    if (flag)
    {
        printf("不在范围内\n");
    }
}
/*
        解题思路:
        从d+1天到21252天循环
        判断p,e,i,d与相应间隔的余数
*/

还有另一种更为快捷的方法:

//以下是更快捷的实现方法
#include <iostream>
using namespace std;
int main()
{
    int p, e, i, d, CaseNo = 0;
    while (cin >> p >> e >> i >> d)
    {
        ++CaseNo;                                            //加法器,计算数据测试的组数
        int k;                                               //设k为枚举的日子
        for (k = d + 1; (k - p) % 23; ++k);                  //这里筛选出了属于23倍数的数字,++k
        for (; (k - e) % 28; k += 23);                       //筛选出同为28与23倍数的数字
        for (; (k - i) % 33; k += 23 * 28);                  //最后筛选出满足三者的乘积倍数的数字
        {
        cout << "case:" << CaseNo << endl;
        cout << "the next peak occurs in " << k - d << endl;
        }
        
    }
    return 0;
}

 


POJ1013: 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。
输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。硬币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:
天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用“up”, “down”, 或 “even”表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的硬币是假币,并说明它比真币轻还是重。
输入样例
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例
K is the counterfeit coin and it is light
  

(原题)1013 -- Counterfeit Dollar

#include <iostream>
#include <cstring>
using namespace std;

char Left[3][7];                          //存储天平左边硬币
char Right[3][7];                         //存储天平右边硬币
char Result[3][7];                        //存储结果
bool IsFake(char c, bool light);          //判断函数,真表示假币c是轻的,假表示假币c为重的,返回值true,假设成立

bool IsFake(char c, bool light)
{
    
    for (int i = 0; i < 3; ++i)
    {
        char* pLeft, * pRight;
        if (light)
        {
            pLeft = Left[i];
            pRight = Right[i];
        }
        else
        {
            pLeft = Right[i];
            pRight = Left[i];
        }
    switch (Result[i][0])
    {
    case'u':
        if (strchr(pRight, c) == NULL)
            return false;
        break;
    case 'e':
        if (strchr(pLeft, c) || strchr(pRight, c))
            return false;
        break;
    case 'd':
        if (strchr(pLeft, c) == NULL)
            return false;
        break;
    }
    }
}



int main() {
    int t;
    cin >> t;
    while (t--)
    {
        for (int i = 0; i < 3; ++i)
            cin >> Left[i] >> Right[i] >> Result[i];
        for (char c = 'A'; c <= 'L'; c++)
        {
            if (IsFake(c, true))
            {
                cout << c << "  is the fake coin  and its light\n";
                break;
            }
            
            else if (IsFake(c, false))
            {
                cout << c << "is the fake coin and its heavy\n";
                break;
            }

        }
    }
}

(注:补习离散数学去了,算法先放)


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进