目录

  • 买房子:
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会
  • 排方阵:
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会
  • 凯撒密码:
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会
  • 回转寿司 :
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会
  • 东东与 ATM :
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会
  • 东东开车了 :
    • 问题描述
      • 题目简述
      • 输入/输出格式
      • 样例
    • 问题分析
      • 解题思路
      • 参考代码
    • 心得体会

买房子:

问题描述

题目简述

蒜头君从现在开始工作,年薪 NNN 万。他希望在蒜厂附近买一套 606060 平米的房子,现在价格是 200200200 万。假设房子价格以每年百分之 KKK 增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 NNN 万全都积攒起来,问第几年能够买下这套房子?(第一年年薪 NNN 万,房价 200200200 万)

输入/输出格式

输入格式:
一行,包含两个正整数 N(10≤N≤50)N(10 \le N \le 50)N(10≤N≤50),K(1≤K≤20)K(1 \le K \le 20)K(1≤K≤20),中间用单个空格隔开。
输出格式:
如果在第 20 年或者之前就能买下这套房子,则输出一个整数 MMM,表示最早需要在第 MMM 年能买下;否则输出"Impossible"。

输出时每行末尾的多余空格,不影响答案正确性

样例

输入样例:
50 10
输出样例:
8

问题分析

解题思路

每年比较一次存款和房价即可,当在20次之前,存款数大于房价,即可以买房子,此时输出年份即可,否则,房间增长为1+k倍,存款数增加年薪的数量。如果20年都无法达到,那么输出Impossible即可。

参考代码
#include <iostream>using namespace std;int main()
{bool can=false;int n,k;cin>>n>>k;float rate;rate=k/100.0;float price=200;int money=n;for(int i=1;i<=20;i++){if(money>=price) {cout<<i;can=true;break;}else{money+=n;price=price*(rate+1);}}if(!can) cout<<"Impossible"; return 0;
}

心得体会

水题1号,没啥可说的,数据范围也不会超过int,唯一一点就是房价的增长公式稍微要注意一下。

排方阵:

问题描述

题目简述

蒜头君的班级里有 n2n^2n2 个同学,现在全班同学已经排列成一个 n∗nn * nn∗n 的方阵,但是老师却临时给出了一组新的列队方案

为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁

这里我们用 000 表示男生,用 111 表示女生

现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的

他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵

不需要旋转则输出 000顺时针旋转 90° 则输出 111顺时针旋转 180° 则输出 222顺时针旋转 270° 则输出 333

若不满足以上四种情况则输出 −1-1−1

若满足多种情况,则输出较小的数字

输入/输出格式

输入格式:
第一行为一个整数 n

接下来的 n 行同学们已经列好的 01方阵;

再接下来的 n 行表示老师希望的的 01方阵。
输出格式:
输出仅有一行,该行只有一个整数,如题所示。

样例

输入样例:
4
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
输出样例:
1

问题分析

解题思路

旋转问题,当顺时针旋转时,旋转后的方阵和原方阵之间有着简单的映射关系,动手画一个仿真之后旋转一下即可发现规律,分情况讨论即可。

参考代码
#include <iostream>using namespace std;int maze[25][25];
int tag[25][25];
int n;int compare()
{bool same=true;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(maze[i][j]!=tag[i][j]) {same=false;break;}}}if(same) return 0;same=true;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(maze[i][j]!=tag[j][n-i+1]) {same=false;break;}}}if(same) return 1;same=true;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(maze[i][j]!=tag[n-i+1][n-j+1]) {same=false;break;}}}if(same) return 2;same=true;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(maze[i][j]!=tag[n-j+1][i]) {same=false;break;}}}if(same) return 3;return -1;
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&maze[i][j]);}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&tag[i][j]);}}printf("%d",compare());return 0;
}

心得体会

水题2号。看似比较困难,实则很简单,自己手画一个方阵之后什么问题都解决了。

凯撒密码:

问题描述

题目简述

Julius Caesar 曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 555 位对应的字符来代替,这样就得到了密文。比如字符’A’用’F’来代替。如下是密文和明文中字符的对应关系。

密文A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

明文V W X Y Z A B C D E F G H I J K L M N O P Q R S T U\

你的任务是对给定的密文进行解密得到明文。

你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入/输出格式

输入格式:
一行,给出密文,密文不为空,而且其中的字符数不超过 200。
输出格式:
输出一行,即密文对应的明文。

输出时每行末尾的多余空格,不影响答案正确性

样例

输入样例:
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
输出样例:
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

问题分析

解题思路

看到题首先就明确了这是一个一一映射的加密关系,所以直接使用unordered_map存储译码表,之后读取字符串,并对出现的大写字母进行译码输出即可。

参考代码
#include <iostream>
#include <unordered_map>
#include <string> using namespace std;unordered_map<char,char> mp;void init()
{mp['A']='V';mp['B']='W';mp['C']='X';mp['D']='Y';mp['E']='Z';mp['F']='A';mp['G']='B';mp['H']='C';mp['I']='D';mp['J']='E';mp['K']='F';mp['L']='G';mp['M']='H';mp['N']='I';mp['O']='J';mp['P']='K';mp['Q']='L';mp['R']='M';mp['S']='N';mp['T']='O';mp['U']='P';mp['V']='Q';mp['W']='R';mp['X']='S';mp['Y']='T';mp['Z']='U';
}void decode()
{char c;while(scanf("%c[^\n]",&c)!=EOF){if(c>='A'&&c<='Z') printf("%c",mp[c]);else printf("%c",c);}
}int main()
{init();decode();return 0;
}

心得体会

水题3号,代码超过一半的部分都是在给unordered_map初始化,这个题除了读取一行的数据稍微陌生一点,其他好像真的没有难度。

回转寿司 :

问题描述

题目简述

东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃

东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。

比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。

东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。

输入/输出格式

输入格式:
输入:
第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
输出格式:
输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)

样例

输入样例:
7
2 2 2 1 1 2 2
输出样例:
4

问题分析

解题思路

字符串找合适子串问题。这个题比较特殊,需要找到1和2相等且这两个数分别是该子序列前半段和后半段唯一出现的数的序列。即,需要出现连续的1和2。直接找的话并不好找,因此,首先对字符串进行处理:将字符串中连续出现的1或者2记为一组,记录其数量。这样,我们只需要遍历新生成的这个数组,对数组的第一个到倒数第二个元素进行遍历,所得到的字符串长度是当前元素值与下一位元素值的最小值*2。取这个数的最大值即可。

参考代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int groups[100010];
int counts[100010];int now_class;
int size;
int sum_num;void init()
{memset(groups,0,sizeof(groups));memset(counts,0,sizeof(counts));size=0;now_class=0;sum_num=0;
}void get_ans()
{int ans=0;for(int i=1;i<=size-1;i++){ans=max(ans,min(counts[i],counts[i+1])*2);}printf("%d",ans);
}int main()
{init();int n;int t;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&t);if(t!=now_class) {groups[size]=now_class;counts[size]=sum_num;size++; now_class=t;sum_num=1;}else{sum_num++;}}groups[size]=now_class;counts[size]=sum_num;get_ans();
}

心得体会

水题4号。其实也不能说是水题了,毕竟想到解题方法还是需要一定的思考的。但总体来说难度不大。

东东与 ATM :

问题描述

题目简述

一家银行计划安装一台用于提取现金的机器。
机器能够按要求的现金量发送适当的账单。
机器使用正好N种不同的面额钞票,例如D_k,k = 1,2,…,N,并且对于每种面额D_k,机器都有n_k张钞票。
例如,
N = 3,
n_1 = 10,D_1 = 100,
n_2 = 4,D_2 = 50,
n_3 = 5,D_3 = 10
表示机器有10张面额为100的钞票、4张面额为50的钞票、5张面额为10的钞票。
东东在写一个 ATM 的程序,可根据具体金额请求机器交付现金。
注意,这个程序计算程序得出的最大现金少于或等于可以根据设备的可用票据供应有效交付的现金。

输入/输出格式

输入格式:
程序输入来自标准输入。 输入中的每个数据集代表特定交易,其格式为:Cash N n1 D1 n2 D2 … nN DN其中0 <= Cash <= 100000是所请求的现金量,0 <= N <= 10是 纸币面额的数量,0 <= nk <= 1000是Dk面额的可用纸币的数量,1 <= Dk <= 1000,k = 1,N。 输入中的数字之间可以自由出现空格。 输入数据正确。
输出格式:
对于每组数据,程序将在下一行中将结果打印到单独一行上的标准输出中。

样例

输入样例:
735 3 4 125 6 5 3 350
633 4 500 30 6 100 1 5 0 1
735 0
0 3 10 100 10 50 10 10
输出样例:
735
630
0
0

问题分析

解题思路

一个多重背包问题,解决方法是使用二进制拆分后转化为0-1背包问题求解。即,对某一种类型的纸币,将其总数拆分成1,2,4,8…2^n之和,如果剩余的数不够拆成2的整数幂,则该数自己作为一组,求出每一组的价值。这样就转化成了0-1背包问题。但是这个题由于空间限制为10000kB,因此用二维数组存放很可能会超内存,因此,采用滚动数组的方法进行空间复杂度优化即可。

参考代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;int w[10010];
int money[12][3];
int f[100010];
int request,n,groups;void init()
{memset(w,0,sizeof(w));memset(money,0,sizeof(money));memset(f,0,sizeof(f));groups=0;
}void change()
{for(int i=1;i<=n;i++){int tag=money[i][1];int a=1;while(tag>=a){groups++;w[groups]=a*money[i][2];tag-=a;a*=2;}if(tag!=0) {groups++;w[groups]=tag*money[i][2];}}
}void solve()
{for(int i=1;i<=groups;i++){for(int j=request;j>=0;j--){if(j-w[i]>=0) f[j]=max(f[j],f[j-w[i]]+w[i]);}}printf("%d\n",f[request]);
}int main()
{while(scanf("%d",&request)!=EOF){init();scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&money[i][1]);scanf("%d",&money[i][2]);}change();solve();}return 0;
}

心得体会

非常好的一道背包问题的练习题,考察的知识点非常的多,使得我对背包问题整个过程都有了非常深刻的印象。另外在做这个题的时候,对于滚动数组有点不太熟悉,导致一开始没有得出正确的结果。因此,还是需要对课上讲解的知识点加强落实。

东东开车了 :

问题描述

题目简述

东东开车出去泡妞(在梦中),车内提供了 n 张CD唱片,已知东东开车的时间是 n 分钟,他该如何去选择唱片去消磨这无聊的时间呢

假设:

CD数量不超过20张
没有一张CD唱片超过 N 分钟
每张唱片只能听一次
唱片的播放长度为整数
N 也是整数

我们需要找到最能消磨时间的唱片数量,并按使用顺序输出答案(必须是听完唱片,不能有唱片没听完却到了下车时间的情况发生)

输入/输出格式

输入格式:
多组输入

每行输入第一个数字N, 代表总时间,第二个数字 M 代表有 M 张唱片,后面紧跟 M 个数字,代表每张唱片的时长 例如样例一: N=5, M=3, 第一张唱片为 1 分钟, 第二张唱片 3 分钟, 第三张 4 分钟

所有数据均满足以下条件:

N≤10000
M≤20
输出格式:
输出所有唱片的时长和总时长,具体输出格式见样例

样例

输入样例:
5 3 1 3 4
10 4 9 8 4 2
20 4 10 5 7 4
90 8 10 23 1 2 3 4 5 7
45 8 4 10 44 43 12 9 8 2
输出样例:
1 4 sum:5
8 2 sum:10
10 5 4 sum:19
10 23 1 2 3 4 5 7 sum:55
4 10 12 9 8 2 sum:45

问题分析

解题思路

这是一个比较常规的0-1背包问题,具体的解法和上题相同,但是难点在于输出方案。具体的方法如下:由于在求解0-1背包时我们是由状态转化方程从前向后推的,知道的是最后的结果,如果要输出从小到大的方案的话只需要从后向前遍历即可。如果发现当前结果a减去第w[j]件物品的价值恰好等于f[n-1][a-w[j]],则说明当前物品需要选,那么就将结果减去w[j]后继续递归,如果发现不相等或者当前物品价值大于当前结果,则说明当前物品不选,这样直接向下递归。递归完成后,输出当前物品的价值。这样即可输出方案。

参考代码
#include <iostream>
#include <cstring>using namespace std;int N,V;
int f[22][10010];
int w[22];void init()
{memset(f,0,sizeof(f));memset(w,0,sizeof(w));
}void print(int ans,int n)
{if(ans==0) return;else{if(ans<w[n]){print(ans,n-1);}else{if(ans==f[n-1][ans-w[n]]+w[n]){print(ans-w[n],n-1);printf("%d ",w[n]);}else{print(ans,n-1);}}}
}void solve()
{for(int i=1;i<=N;i++){for(int j=0;j<=V;j++){f[i][j]=f[i-1][j];if(j-w[i]>=0) f[i][j]=max(f[i][j],f[i-1][j-w[i]]+w[i]);}}int ans=f[N][V];print(ans,N);printf("sum:%d\n",ans);
}int main()
{while(scanf("%d %d",&V,&N)!=EOF){init();for(int i=1;i<=N;i++){scanf("%d",&w[i]);}solve();}return 0;
}

心得体会

这个题让我思考了很久如何输出方案,虽然说本身输出方法不算难,但是由于比较抽象,因此做的时候不是很顺利。不过,这也让我牢牢记住了怎么输出0-1背包问题的方案。

week11——作业(水题+背包问题)相关推荐

  1. c语言编写程序判断图的连通,图论期末大作业编程题(如何判断一个4连通4正则图为无爪、无K4图)...

    博士期间估计这可能是唯一一个要编程的作业,搞了半天弄出这个东西,放这里为以后用到的时候查找方便. 说来也是可笑,读博士期间发现大家对上课也都没什么兴趣,老师也是那么回事,都说博士期间学的课程是要有助于 ...

  2. [总结:]BZOJ水题70题留念

    时间过得很快,转眼间BZOJ已经做了70道水题了.现在做一个整理 1001:狼抓兔子:平面图最小割转化为最短路,主要麻烦再建图 1002:轮状病毒:行列式+高精度 1008:越狱:快速幂+组合数学 1 ...

  3. 水题/poj 1852 Ants

    1 /* 2 PROBLEM:poj1852 3 AUTHER:Nicole 4 MEMO:水题 5 */ 6 #include<cstdio> 7 using namespace std ...

  4. HDU2673-shǎ崽(水题)

    如果不能够直接秒杀的题,就不算水题.又应证了那句话,有时候,如果在水题上卡住,那么此题对于你来说,也就不算是水题了额~~ 刚睡醒,迷迷糊糊. 题目的意思很简单,求一个最大的,再求一个最小的.几乎是什么 ...

  5. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  6. 图论刷水题记录(一)(最短路-----dijkstra算法)

    最近实在不知道干些什么,感觉自己除了水题什么都不会做,算了去刷一刷图论的水题吧本来想合起来一起发,想了想太长的话以后看起来也不方便,题目所以今天晚上就先发了dij部分,由上到下由易变难. 1.POJ ...

  7. hdu 2041:超级楼梯(水题,递归)

    超级楼梯Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  8. HDU2568 前进【水题】

    前进 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. CF Round #426 (Div. 2) The Useless Toy 思维 水题

    题目链接: http://codeforces.com/contest/834/problem/A 题目描述: 输入起始状态和结束状态和数列长度, 判断旋转方向是顺时针逆时针还是不合理 解题思路: 长 ...

最新文章

  1. [转]centos5.2用memcache 来作PHP 的session.save_handler
  2. 清华大学校内智能车竞赛辅导资料
  3. 机器学习笔记:向量自回归模型VAR
  4. 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!
  5. 零基础如何学好Python?Python有哪些必须学的知识?
  6. LeetCode(38): 报数
  7. 计算机背景为什么总是黑色,电脑背景变成黑色的了是为什么
  8. php swoole udp,基于Swoole如何搭建UDP服务?
  9. 使用github+hexo搭建静态blog
  10. 深度学习《VAE-GAN》
  11. ShardingSphere(四) 垂直分库配置搭建,实现写入读取
  12. 计算机英语手抄报活动主题,八一小学举行学生电脑绘画英语手抄报比赛
  13. 售票系统的组件图和部署图_门禁安装大样图、管线图、系统图、电锁安装图
  14. 计算机硬件中板卡目前设备有哪几种,呼叫中心所需的硬件设备都有哪些?
  15. 3.企业应用架构模式 --- 映射到关系数据库
  16. 水电缴费系统php源码_php简易扫码付教育收费系统 v1.2
  17. 材料之kube-dns.yaml
  18. 笔记本电脑桌面便签哪个软件好用,桌面便签软件下载
  19. MybatisPlusException: Your property named “xxx“ cannot find the corresponding database column name!
  20. 【整理】GOS附件的上传与下载

热门文章

  1. 呕心沥血一周,我交出了这篇 List 面试文章,细不细你们定
  2. WSL2配置图形界面-MATE
  3. 怎么解除计算机程序锁定,浏览器被锁定主页要怎么解除?
  4. git: Your branch and ‘origin/xxx‘ have diverged,and have 1 and 1 different commits each, respectivel
  5. 高端羽绒服价值重构 SKYPEOPLE天空人的新答案
  6. php的取数组长度,php获取数组长度详解
  7. Cesium立体建筑物闪烁效果
  8. Android使用高德和风天气Sdk获取定位实况天气数据(二)
  9. 图书馆管理系统-登录与注册部分(c语言实现)
  10. xctf BABYRE