算法设计与分析-实验2
问题 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相关推荐
- 太原理工大学linux与python编程r实验报告_太原理工大学算法设计与分析实验报告...
<太原理工大学算法设计与分析实验报告>由会员分享,可在线阅读,更多相关<太原理工大学算法设计与分析实验报告(12页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: ...
- 格雷码算法c语言实验报告,算法设计与分析实验报告
本科生实验报告 课程名称:算法设计与分析 实验项目:递归和分治算法 实验地点:计算机系实验楼110 专业课:物联网1601学生.2016002105 学生姓名:于 指导员:郝晓丽 2018年5月4日 ...
- 算法设计与分析实验指导(完整版)
算法设计与分析实验指导 文章目录 算法设计与分析实验指导 1. 快速排序及第k小数 1.1 快速排序 1.1.1 Implementation 1 1.1.2 算法特性分析 1.1.3 Improve ...
- C/C++ 算法设计与分析实验报告
算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...
- 深大算法设计与分析实验二——分治法求最近点对问题
源代码: 深大算法设计与分析实验二--分治法求最近点对问题代码-C/C++文档类资源-CSDN下载 目录 实验问题 一.实验目的: 二.内容: 三.算法思想提示 产生不重复的随机点算法: 蛮力算法: ...
- 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...
动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...
- 【图的着色问题】算法设计与分析实验1
计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...
- 【图的同构识别】算法设计与分析实验2
计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验2:图的同构识别 指导教师 姓名 重剑DS 学号 实验日期 2022.05.19 一.问题描述,含输入.输出数据内容.格式 ...
- 算法设计与分析 实验三 回溯法求解地图填色问题
回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...
- 算法设计与分析 实验二 分治法求解最近点对问题
分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...
最新文章
- 【Python】spyder编译器调试时添点断点的方法
- macOS zip 打包加密和 unzip 解压
- webpack图解-学习笔记
- c语言程序stm8s,stm8s的c语言编程例程
- 单向链表的建立和简单的增删改查
- mysql mgr 三节点_详解MySQL 5.7 MGR单主确定主节点方法
- linux之秘钥登录
- 什么是Tensor Flow和lite以及数据流图
- PhpStorm连接docker容器内的php XDebug进行断点调试
- 夺命雷公狗---微信开发54----微信js-sdk接口开发(1)之快速入门
- JAVA 生成API接口文档
- 初学者PLC程序及有效学习方法
- 蜗牛星际A单千兆群晖系统崩溃恢复记录
- openwrt 挂载硬盘NFS共享,非SMB共享
- Linux 添加一块新硬盘
- 【FPGA】FPGA对AD7606进行串行数据采集
- 离散数学实验二 真值表
- 诺基亚n78微信显示服务器忙,诺基亚N78系统详细解析
- 如何使用Aiseesoft Mac Video Enhancer让视频更加清晰
- ubuntu 22.04 安装搜狗中文输入法