CUMTOJ算法实验四

问题 A: 判断日期是否符合格式

题目描述

我们知道一年有12个月,每个月最多有31天,年有平年和闰年之分,本题目要求如果输入一个日期,程序需要判断用户输入的日期是否正确。

提示:测试输入的三个数字中,年份是正数,月份和日期有可能是负数,程序需要对这两个数为负数的情况进行判断。

输入

多组测试用例,对每组测试用例:

用户输入是三个数字,分别表示年,月和日。 例如 2007 10 21 ,表示2007年10月21日,这个输入经过判断是正确的。又例如输入 1993 11 38 ,这个输入经过判断是错误的,因为日期不能超过31天。

输出

程序的输出分为两种,1或者0。1表示输入正确,0表示输入错误。

样例输入

2011 21 10

样例输出

0

思路

建立每个月对应天数的数组。

2月要考虑是平年还是闰年,平年28天,闰年29天,我们先设为28天。

首先判断是否为闰年。

然后看月和日是否符合条件。

代码

#include<iostream>
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{bool isLeap(int year);int y, m, d;while(~scanf("%d %d %d", &y, &m, &d)){bool flag = isLeap(y);if(m <= 0 || m > 12 || d <= 0){cout << 0 << endl;continue;}int dd = days[m];if(m == 2 && flag)dd++;if(d <= dd){cout << 1 << endl;continue;}cout << 0 << endl;}return 0;
}
bool isLeap(int year)
{if(year % 400 == 0)return true;if(year % 4 == 0 && year % 100)return true;return false;
}

问题 B: 哈夫曼编码

题目描述

给定一只含有小写字母的字符串;输出其哈夫曼编码的长度

输入

第一行一个整数T,代表样例的个数,接下来T行,每行一个字符串,0<T<=2000,字符串长度0<L<=1500.

输出

对于每个字符串,输出其哈夫曼编码长度

样例输入

3
hrvsh
lcxeasexdphiopd
mntflolfbtbpplahqolqykrqdnwdoq

样例输出

10
51
115

思路

要构造哈夫曼编码首先就必须要计算出每个字母出现的频率,扫描一遍即可;接下来就需要用这些频率来构造哈夫曼树,在这里需要使用优先队列这个数据结构,将频率全部push进入优先队列按从小到大排列后,使用贪心算法,每次都是将最小的两个频率拿出来构造哈夫曼树,两数的和再次push进队列,重复进行即可。

代码

#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
int main()
{int T, i;cin >> T;while(T--){char s[2000];cin >> s;int fre[26] = { 0 };int len = strlen(s);for(i = 0; i < len; i++){fre[s[i] - 'a']++;}priority_queue<int, vector<int>, greater<int> >q;for(i = 0; i < 26; i++){if(fre[i] > 0){q.push(fre[i]);}}int sum = 0;while(q.size() >= 2){int a = q.top();q.pop();int b = q.top();q.pop();sum += a + b;q.push(a + b);}cout << sum << endl;}return 0;
}

问题 C: 2n皇后问题

题目描述

给定一个 n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 n 个黑皇后和 n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n 小于等于 8。

输入

输入的第一行为一个整数 n,表示棋盘的大小。

接下来 n 行,每行 n 个 0 或 1 的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为 0,表示对应的位置不可以放皇后。

输出

输出一个整数,表示总共有多少种放法。

样例输入

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出

2

思路

代码

问题 D: 图的m着色问题

题目描述

给定无向连通图G和m种不同的颜色,用这些颜色给图的各个顶点着一种颜色,若某种方案使得图中每条边的2个顶点的颜色都不相同,则是一个满足的方案,找出所有的方案。

输入

第一行有3个正整数n,k和m,分别表示n个顶点,k条边,m种颜色
接下来k行,每行2个正整数,表示一条边的两个顶点

输出

所有不同的着色方案数

样例输入

5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5

样例输出

48

思路

代码

问题 E: 部分和问题

题目描述

给定n个整数,判断是否可以从中选择若干数字,使得他们的和恰好为k。

输入

多组测试用例。

对于每组测试用例,第一行一个正整数n,第二行n个整数,第三行一个整数k。

1≤N≤20,输入整数及k均小于1e8。

输出

若可以使得和为k,输出”Yes”,否则”No”。

样例输入

4
1 2 4 7
13

样例输出

Yes
247

思路

很明显,这是一道简单的dfs搜索,直接理由dfs的定义解决,不过最让人头痛的是如何实现 剪枝,减少不必要的时间浪费,剪枝还不熟练,这道题需要减掉的是

1.从当前状态如何转移都不会存在解

2.当sum超过k时,也没必要继续搜索

代码

#include <iostream>
using namespace std;
int n, k, a[22], b[22];
int main()
{bool dfs(int x, int sum);int i;while(~scanf("%d", &n)){for(i = 0; i < n; i++)cin >> a[i];cin >> k;if(dfs(0, 0)){cout << "Yes" << endl;for(i = 0; i < n; i++)if(b[i])cout << a[i];cout << endl;}elsecout << "No" << endl;}
}
bool dfs(int x, int sum)  //从左到右遍历一遍可得解
{if(sum > k)return false;    //此处属于后期补充,当代码加上这一个剪枝后,时间就会变为8MS,所以平时还要多注重剪枝,考虑优化代码啊!!!if(x == n) return sum == k;  //如果前n项计算过了,返回sum=k是否相等if(dfs(x + 1, sum)){b[x] = 0;return true;}   //如果不加上a[x]的情况,标记为0;if(dfs(x + 1, sum + a[x])){b[x] = 1;return true;}   //如果加上a[x]的情况,标记为1;return false;
}

本文参考了下面大佬的文章

  1. https://blog.csdn.net/gar_denia/article/details/86760575
  2. https://comydream.github.io/2018/10/19/algorithm-experiment-3/
  3. https://blog.csdn.net/fanke666/article/details/68063260

CUMTOJ算法实验四相关推荐

  1. 深大算法实验四——流水线问题

    代码链接:深大算法实验四--车间动态规划代码-C++文档类资源-CSDN下载 目录 实验目的与要求: 实验过程及内容: 蛮力法: 动态规划法: 改进 空间优化方案: 问题1,关于最优解的存储方案 问题 ...

  2. matlab信息隐藏算法,实验四--基于DCT域的信息隐藏算法

    <实验四--基于DCT域的信息隐藏算法>由会员分享,可在线阅读,更多相关<实验四--基于DCT域的信息隐藏算法(6页珍藏版)>请在人人文库网上搜索. 1.实验四 基于DCT域的 ...

  3. 【NOJ1149】【算法实验四】旅游预算

    1149.旅游预算 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同.旅游预算有 ...

  4. 【NOJ1149】【算法实验四】【DP_动态规划】旅游预算/加油站问题

    1149.旅游预算 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同. 旅游预 ...

  5. 【NOJ1047】【算法实验四】田忌赛马(tian ji racing)

    1047.田忌赛马(tian ji racing) 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 田忌与齐王赛马,双方各有n匹马参赛(n<=100),每场比赛赌注为1两 ...

  6. 【算法实验四】--【动态规划】--防卫导弹

    1046.防卫导弹 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一种新型的防卫导弹可截击多个攻击导弹.它可以向前飞行,也可以用很快的速度向下飞行,可以毫无损伤地截击进攻导 ...

  7. 【算法实验四】(DP-动态规划)【花生米3】

    1084.花生米(三) 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库--).这次Tom ...

  8. CUMTOJ算法作业二

    CUMTOJ算法作业二 问题 A: 单词排序 题目描述 小红学会了很多英文单词,妈妈为了帮小红加强记忆,拿出纸.笔,把 N 个单词写在纸上的一行里,小红看了几秒钟后,将这张纸扣在桌子上.妈妈问小红:& ...

  9. 实验四 查找和排序算法实现

    广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验四 查找和排序算法实现 一.实验目的: 1.各种排序算法 ...

最新文章

  1. vb.net结构化异常处理和“邪用”
  2. 两两对应成排的 表格 样式
  3. ​每日一皮:​你的Frozen Throne...
  4. 算法导论之多项式与快速傅里叶变换
  5. db:migrate
  6. 编程谜题:提升你解决问题的训练场
  7. JAVA对list集合进行排序Collections.sort()
  8. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(1月16日-2月5日)
  9. 51nod 1428 活动安排问题 (贪心+优先队列)
  10. ios真机中Text组件出现多余边框
  11. net-snmp的定制编译
  12. socket编程—UDP套接字
  13. P1157 组合的输出(#define mian main)
  14. C03-Java同步实践加强班
  15. junit5_JUnit 5测试中的临时目录
  16. 商汤AR开发之旅(1)-- 关于SenseAR SDK
  17. 解读:学习网络安全自学好还是报培训班好
  18. 成都新房二手房房价采集
  19. 第一章 计算机系统概述
  20. Python——创建对象

热门文章

  1. 迅雷正式回应搜狐诉讼,揭示网络视频行业潜规则
  2. 基于STM32CUBEMX驱动多个VL6180X
  3. 物联网平台TZ-IOT发布透传云内测服务:V1.0
  4. linux命令记忆方法,Linux命令快速巧记法
  5. 在讨论全景视频的未来之前,我们先搞清楚全景视频是如何实现的
  6. 内存寻址:逻辑地址到物理地址转化
  7. 航拍茅山宝盛园透明屋“镶嵌”茶园犹如外星基地
  8. Apache Flink从入门到放弃——Flink简介(一)
  9. 博通收购 VMware 计划受阻,英国监管机构介入
  10. 总结python中列表、元组、字典、集合的共同点和不同点