问题 A: algorithm-迷宫游戏
题目描述
你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?
输入
第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。
第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0<z<=200)表示道路,表示从房间x到房间y(双向)的道路,注意,最多只有一条道路连结两个房间,你需要的时间为z。
输入保证从start到end至少有一条路径。
输出
占一行,分别最短时间和相应的最大得分,中间用空格隔开。
样例输入 Copy
3 2 0 2
1 2 3
0 1 10
1 2 11
样例输出 Copy
21 6

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;#define Int __int64
#define INF 0x3f3f3f3fconst int MAXN = 555;
int n, m, s, e;int maze[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int score[MAXN];
int ans[MAXN];void init() {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) maze[i][j]  = 0;else maze[i][j] = INF;}}memset(dis, 0, sizeof(dis));memset(vis, false, sizeof(vis));memset(ans, false, sizeof(ans));
}void Dijkstra() {for (int i = 0; i < n; i++) {scanf("%d", &score[i]);}int u, v, w;for (int i = 0; i < m; i++) {scanf("%d %d %d", &u, &v, &w);if (w < maze[u][v]) {maze[u][v] = w;maze[v][u] = w;}}for (int i = 0; i < n; i++) {dis[i] = maze[s][i];if (i != s) ans[i] = score[s] + score[i];//初始化的时候也要判断等于的情况else ans[i] = score[i];}for (int i = 0; i < n; i++) {int pos, Min = INF;for (int a = 0; a < n; a++) {if (vis[a]) continue;if (dis[a] < Min) {Min = dis[a];pos = a;}}vis[pos] = true;for (int a = 0; a < n; a++) {if (maze[pos][a] < INF) {if (dis[a] > dis[pos] + maze[pos][a]) {dis[a] = dis[pos] + maze[pos][a];ans[a] = ans[pos] + score[a];} else if ((dis[a] == dis[pos] + maze[pos][a]) && (ans[a] < ans[pos] + score[a]) && pos != a) {/*就是这里要判断等于的时候是不行的*/ans[a] = ans[pos] + score[a];} else {continue;}}}}
}
int main()
{//freopen("input.txt", "r", stdin);while (scanf("%d %d %d %d", &n, &m, &s, &e) != EOF) {init();Dijkstra();printf("%d %d\n", dis[e], ans[e]);}return 0;
}

问题 B: algorithm-Homework
[命题人 : 080063]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
临近开学了,大家都忙着收拾行李准 备返校,但 I_Love_C 却不为此担心! 因为他的心思全在暑假作业上:目前为止还未开动。
暑假作业是很多张试卷,我们这些从试卷里爬出来的人都知道,卷子上的题目有选择题、填空题、简答题、证明题等。而做选择题的好处就在于工作量很少,但又因为选择题题目都普遍很长。如果有 5 张试卷,其中 4 张是选择题,最后一张是填空题,很明显做最后一张所花的时间要比前 4 张长很多。但如果你只做了选择题,虽然工作量很少,但表面上看起来也已经做了4/5的作业了。
I_Love_C决定就用这样的方法来蒙混过关,他统计出了做完每一张试卷所需的时间以及它做完后能得到的价值(按上面的原理,选择题越多价值当然就越高咯)。
现在就请你帮他安排一下,用他仅剩的一点时间来做最有价值的作业。
输入
测试数据包括多组。每组测试数据以两个整数 M,N(1<M<20,1<N<10000) 开头,分别表示试卷的数目和 I_Love_C 剩下的时间。接下来有 M 行,每行包括两个整数 T,V(1<T<N,1<V<10000)分别表示做完这张试卷所需的时间以及做完后能得到的价值,输入以 0 0 结束。
输出
对应每组测试数据输出 I_Love_C 能获得的最大价值。保留小数点 2 位
提示:float 的精度可能不够,你应该使用 double 类型。
样例输入 Copy
4 20
4 10
5 22
10 3
1 2
0 0
样例输出 Copy
37.00

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
using namespace std;struct Paper
{int time;int value;double perValue;bool operator<(const Paper & h) const{return (h.perValue < perValue);}
};int main()
{int M, N;while (cin >> M >> N && (M || N)){vector<Paper> list(M);for (int i = 0; i < M; ++i){cin >> list[i].time >> list[i].value;list[i].perValue = list[i].value / double(list[i].time);}sort(list.begin(), list.end());double sum = 0;for (int i = 0; i < M; ++i){if (N >= list[i].time){sum += list[i].value;N -= list[i].time;}else{sum += list[i].perValue * N;break;}}cout << setiosflags(ios::fixed) << setprecision(2) << sum << endl;}return 0;
}

问题 C: algorithm-哈夫曼编码
[命题人 : 080063]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
给定一只含有小写字母的字符串;输出其哈夫曼编码的长度
输入
第一行一个整数T,代表样例的个数,接下来T行,每行一个字符串,0<T<=2000,字符串长度0<L<=1500.
输出
对于每个字符串,输出其哈夫曼编码长度
样例输入 Copy
3
hrvsh
lcxeasexdphiopd
mntflolfbtbpplahqolqykrqdnwdoq
样例输出 Copy
10
51
115

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int main()
{int t;cin>>t;while(t--){char s[2000];cin>>s;int fre[26]={0};int len=strlen(s);for(int i=0;i<len;i++){fre[s[i]-'a']++;}priority_queue<int,vector<int>,greater<int> >q;for(int 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;
}

问题 D: algorithm-汽车费用
[命题人 : 080063]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<100),它可以通过无限次的换车来完成旅程。最后要求费用最少。
输入
第一行十个整数分别表示行走1到10公里的费用(<=500)。注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少。第二行一个整数n表示,旅客的总路程数。
输出
仅一个整数表示最少费用。

样例输入 Copy
12 21 31 40 49 58 69 79 90 101
15
样例输出 Copy
147

#include<iostream>
#include<vector>
using namespace std;
int main(){vector<int> res=vector<int>(11,0);for(int i=1;i<=10;i++){cin>>res[i];}int m;cin>>m;vector<int> ans=vector<int>(m+1,10000);ans[0]=0;for(int i=1;i<=10;i++){for(int j=i;j<=m;j++){ans[j]=min(ans[j],ans[j-i]+res[i]);}}cout<<ans[m];
}

问题 E: algorithm-八皇后问题
[命题人 : 080063]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
努比亚和苏丹没有子女,所以他要从一些有集成资格的继承者中挑选一个出来继承王位。他希望这个继承者足够聪明,所以他准备了一个西洋棋盘,上面的每个格子中均有一个 1-99 的数字。他又准备了 8 个皇后棋子。
8 皇后的规则就是不能有任何棋子同行或者同列或者同斜线,在满足这个规则的同时,王位继承者还需要让 8 个皇后所在的位置的数字的和是最大的。
输入
输入一个数字 k(k≤20),代表棋盘的数量。
接下来有 k 个棋盘,每个棋盘有 64 个数字,分成 8 行 8 列输入,具体可见样例,每一个数字均小于 100。
输出
每一个棋盘对应输出最大的数值, 一共输出 k行
样例输入 Copy
1
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
样例输出 Copy
260

#include<iostream>
#include<vector>
using namespace std;
int result;
void dfs(vector<vector<int> >&m,vector<bool>res,vector<pair<int,int> >check,int start,int n,int sum){if(n==8){result=max(result,sum);return;}bool flag=1;for(int i=0;i<8;i++){if(!res[i]){flag=1;for(int j=0;j<check.size();j++){if(start+i==check[j].first+check[j].second||start-i==check[j].first-check[j].second){flag=0;break;}}if(flag) {res[i] = 1;check.push_back(make_pair(start , i));dfs(m, res, check, start + 1, n + 1, sum + m[start][i]);check.pop_back();res[i] = 0;}}}
}
int main(){vector<bool> res=vector<bool>(8,0);vector<pair<int,int> >check;int len;cin>>len;while(len--) {result=0;vector<vector<int> > sex = vector<vector<int> >(8, vector<int>(8, 0));for (int i = 0; i < 8; i++) {for (int j = 0; j < 8; j++) {cin >> sex[i][j];}}dfs(sex,res,check,0,0,0);cout<<result<<endl;}return 0;
}

问题 F: algorithm-法师康的工人
[命题人 : 080063]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机。第一个工人在200时刻开始(从6点开始计时,以秒作为单位)在生产线上开始生产,一直到1000时刻。第二个工人,在700时刻开始,在1100时刻结束。第三个工人从1500时刻工作到2100时刻。期间最长至少有一个工人在生产线上工作的连续时间为900秒(从200时刻到1100时刻),而最长的无人生产的连续时间(从生产开始到生产结束)为400时刻(1100时刻到1500时刻)。
你的任务是用一个程序衡量N个工人在N条产品线上的工作时间列表(1≤N≤5000,以秒为单位)。
·最长的至少有一个工人在工作的时间段
·最长的无人工作的时间段(从有人工作开始计)
输入
输入第1行为一个整数N,第2-N+1行每行包括两个均小于1000000的非负整数数据,表示其中一个工人的生产开始时间与结束时间。
输出
输出为一行,用空格分隔开两个我们所求的数。
样例输入 Copy
3
200 1000
700 1100
1500 2100
样例输出 Copy
900 400

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool compare(pair<int,int> a,pair<int,int> b){if(a.first==b.first)return a.second<b.second;return a.first<b.first;
}
int main(){int a;cin>>a;vector<pair<int,int> > res=vector<pair<int,int> >(a);for(int i=0;i<a;i++){cin>>res[i].first>>res[i].second;}sort(res.begin(),res.end(),compare);int freetime=0;int busytime=res[0].second-res[0].first;for(int i=1;i<a;i++){if(res[i].first<=res[i-1].second){res[i].first=res[i-1].first;res[i].second=max(res[i-1].second,res[i].second);}else{freetime=max(freetime,res[i].first-res[i-1].second);}busytime=max(busytime,res[i].second-res[i].first);}cout<<busytime<<" "<<freetime<<endl;return 0;
}

算法设计与分析-实验2相关推荐

  1. 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...

    <太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...

  2. 格雷码算法c语言实验报告,算法设计与分析实验报告

    本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...

  3. 算法设计与分析实验指导(完整版)

    算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...

  4. C/C++ 算法设计与分析实验报告

    算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...

  5. 深大算法设计与分析实验二——分治法求最近点对问题

    源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...

  6. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  7. 【图的着色问题】算法设计与分析实验1

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...

  8. 【图的同构识别】算法设计与分析实验2

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验2:图的同构识别 指导教师 姓名 重剑DS 学号 实验日期 2022.05.19 一.问题描述,含输入.输出数据内容.格式 ...

  9. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  10. 算法设计与分析 实验二 分治法求解最近点对问题

    分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...

最新文章

  1. 【Python】spyder编译器调试时添点断点的方法
  2. macOS zip 打包加密和 unzip 解压
  3. webpack图解-学习笔记
  4. c语言程序stm8s,stm8s的c语言编程例程
  5. 单向链表的建立和简单的增删改查
  6. mysql mgr 三节点_详解MySQL 5.7 MGR单主确定主节点方法
  7. linux之秘钥登录
  8. 什么是Tensor Flow和lite以及数据流图
  9. PhpStorm连接docker容器内的php XDebug进行断点调试
  10. 夺命雷公狗---微信开发54----微信js-sdk接口开发(1)之快速入门
  11. JAVA 生成API接口文档
  12. 初学者PLC程序及有效学习方法
  13. 蜗牛星际A单千兆群晖系统崩溃恢复记录
  14. openwrt 挂载硬盘NFS共享,非SMB共享
  15. Linux 添加一块新硬盘
  16. 【FPGA】FPGA对AD7606进行串行数据采集
  17. 离散数学实验二 真值表
  18. 诺基亚n78微信显示服务器忙,诺基亚N78系统详细解析
  19. 如何使用Aiseesoft Mac Video Enhancer让视频更加清晰
  20. ubuntu 22.04 安装搜狗中文输入法

热门文章

  1. pycharm debug 断点调试
  2. 后端技术趋势指南|如何选择自己的技术方向
  3. 哦豁?这个程序员…… 有、东西!
  4. RabbitMQ脑裂
  5. STL中sort算法简析
  6. 二叉堆详解实现优先级队列
  7. 英特尔QSV技术在FFmpeg中的实现与使用
  8. Go基础编程:格式化输出、类型转换、类型别名
  9. OCP大会 | T-Flex 2.0服务器框架介绍(附PDF)
  10. apr_file_seek 踩坑