绊脚石乃是进身之阶 jzoj 2017.8.15 B组
来源:互联网 发布:社会调查数据库 编辑:程序博客网 时间:2024/06/05 15:25
先声明,今天的题真的是很水啊。。。。。。。
第一题
- 平台 (Standard IO)
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
Goto ProblemSet
Description
Alice要搭建平台,平台不能漂在空气中,必须要有两根柱子支撑,具体地说,每个平台的两端必须由一根柱子支撑,柱子的另一端在地板或另一个平台上。
给你平台的放置位置(如下左图所示),每个平台的位置由它的高度(离地面的垂直距离)和水平方向两个端点的坐标决定,每根柱子必须安放在离端点0.5个单位的位置,如下右图所示。
编程计算所需柱子总长是多少。
Input
第一行包含整数N,1<=N<=100,表示平台的数量。
接下来N行,每行三个数Y,X1和X2用来描述每个平台的位置,Y表示高度,X1,X2表示两个端点的X坐标,三个数都是正整数,并且小于等于10000,同时满足X2>X1+1(也就是说平台的长度至少为2)。
输入保证平台不会重叠。
Output
输出柱子的总长度。
Sample Input
输入1:
3
1 5 10
3 1 5
5 3 7
输入2:
5
50 50 90
40 40 80
30 30 70
20 20 60
10 10 50
Sample Output
输出1:
14
输出2:
200
题解:很水很水的题,直接暴力啊。
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int n,y[10010],ans=0;struct hh{ int l,r,h;}a[1001];int come(hh a,hh b){ if(a.h!=b.h)return a.h<b.h; else return a.l<b.l;}int main(){ memset(y,0,sizeof(y)); cin>>n; for(int i=1;i<=n;i++) { scanf("%d%d%d",&a[i].h,&a[i].l,&a[i].r); } sort(a+1,a+n+1,come); for(int i=1;i<=n;i++) { if(y[a[i].l]==0) ans+=a[i].h; else { ans+=a[i].h-y[a[i].l]; } if(y[a[i].r-1]==0) ans+=a[i].h; else { ans+=a[i].h-y[a[i].r-1]; } for(int j=a[i].l;j<=a[i].r-1;j++) { y[j]=a[i].h; } } cout<<ans; return 0;}
第二题
- 单足跳 (Standard IO)
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
Goto ProblemSet
Description
游戏在一行N个方块中进行,编号为1到N,一开始Alice在方块1中,第一次只能跳到方块2中,接下来每一次跳跃必须满足以下两个限制:
(1) 如果是向前跳(即跳到比现在编号大的方块),跳跃距离必须比上一次要大1;
(2) 如果是向后跳(即跳到比现在编号小的方块),跳跃距离必须跟上一次一样。
例如,第一次跳跃后,Alice可以跳回1也可以跳到4。
每进入一个方块,Alice必须支付一定的费用,Alice的目标花最少的钱从方块1跳到方块N。编程计算最小的花费。
Input
第一行包含一个整数N(2<=N<=1000),表示方块的个数。
接下来N行,每行包含一个不超过500的正整数表示进入该方块的费用。
Output
输出Alice跳到N的最小花费。
Sample Input
输入1:
6
1
2
3
4
5
6
输入2:
8
2
3
4
3
1
6
1
4
Sample Output
输出1:
12
输出2:
14
Data Constraint
Hint
【样例解释】
样例1中,在跳到2后,Alice选择跳回1,再跳到3然后再跳到6。
题解:设分f[i][d]为调到i点,这一步跳的距离是d,转移方程就是
f[i][d]=min(f[i][d],f[i+d][d]+a[i]);
ps:a[i]表示i点的费用
#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,ans=0x7fffffff,r[1010]={0},f[1010][1010],a[1010]={0};int main(){ memset(r,0,sizeof(r)); memset(f,0x5f,sizeof(f)); cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } r[1]=0; f[1][0]=0; for(int d=1;d<=n;d++) for(int i=n;i>=1;i--) { if(i>d&&r[i-d]==d-1) { f[i][d]=min(f[i][d],f[i-d][d-1]+a[i]); r[i]=d; } if(i+d<=n&&r[i+d]==d) { f[i][d]=min(f[i][d],f[i+d][d]+a[i]); r[i]=d; } } int ans=0x7fffffff; for(int i=1;i<=n;i++) { ans=min(ans,f[n][i]); } cout<<ans; return 0;}
第三题
- 生日聚餐 (Standard IO)
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
Goto ProblemSet
Description
Alice在餐馆里当服务员,今天是她生日,她请求厨师帮她准备生日晚餐,晚餐由N种原料做成,每道菜所需每种原料的数量是一样的。
厨房里有一些原料,但不够,Alice还需要从旁边的超市中购买一些回来。超市里什么原料都有,每种原料都分大包装和小包装。Alice有M元钱,她想利用这M元钱购买原料使得能做出最多的菜。
Input
第一行包含两个整数N和M(1<=N<=100,1<=M<=100000),接下来N行,每行包含6个正整数,用来描述这种原料的信息,具体如下:
(1) X:10<=X<=100,表示一道菜中必须含有这种原料的数量;
(2) Y:1<=Y<=100,表示这种原料厨房已有的数量;
(3) Sm:1<=Sm<=100,表示超市里小包装中含有这种原料数量;
(4) Pm:10<=Pm<=100,表示小包装的价格;
(5) Sv:1<=Sv<=100,表示超市里大包装中含有这种原料数量;
(6) Pv:10<=Pv<=100,表示大包装的价格;
Output
输出最多能做多少道菜。
Sample Input
输入1:
2 100
10 8 10 10 13 11
12 20 6 10 17 24
输入2:
3 65
10 5 7 10 13 14
10 5 8 11 14 15
10 5 9 12 15 16
Sample Output
输出1:
5
输出2:
2
Data Constraint
Hint
【样例说明】
样例1中,Alice购买第一种原料3个小包装和1个大包装,购买第二种原料1个小包装和2个大包装,一共花费3×10+1×11+1×10+2×24=99元。
两种原料的数量分别为51个(8+3×10+11)和60个(20+1×6+2×17),可以做出5道菜。
题解:二分答案,然后验证答案合法性,验证那里可以用dp,然而我用了暴力.
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,m;struct hh{ int x,y,sm,pm,sv,pv;}a[100000];int mid=0,sum=0,num=0,ans=0;int main(){ //freopen("in.txt","r",stdin); cin>>n>>m; for(int i=1;i<=n;i++) { //cin>>a[i].x>>a[i].y>>a[i].sm>>a[i].pm>>a[i].sv>>a[i].pv; scanf("%d%d%d %d%d%d",&a[i].x,&a[i].y,&a[i].sm,&a[i].pm,&a[i].sv,&a[i].pv); } int l=0,r=100000; while(l<=r) { mid=(l+r)/2; sum=0; for(int i=1;i<=n;i++) { num=0x7fffffff; int need=(a[i].x*mid)-a[i].y; int t=need/a[i].sm; int v; if(need%a[i].sm) t++; for(int j=0;j<=t;j++) { if(need- j*a[i].sm<0) num=min(num,j*a[i].pm );//千万注意减完后为负数的情况 v=(need- j*a[i].sm)/a[i].sv; if((need-j*a[i].sm)%a[i].sv) v++; num=min(num,( ( j*a[i].pm ) + ( v*a[i].pv ) ) ); } sum+=num; if(sum>m) break; } if(sum<=m) { l=((l+r)/2)+1; ans=mid; } else r=((l+r)/2)-1; } cout<<ans; return 0;}
第四题
- 数学题 (Standard IO)
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits
Goto ProblemSet
Description
当Alice在浏览数学书时,看到一个等式A=S,奇怪的是A和S并不相等。Alice发现可以通过在A中添加加号“+”从而使得等式成立。
编程计算最少需要插入多少加号使得等式成立。允许每个数有多个前导0。
Input
输入第一行包含一个等式形式为A=S。
A和S都是没有前导0的正整数,并保证不相同。
A最多有1000位。
S<=5000。
输入保证有解。
Output
输出最少需要插入的加号数量。
Sample Input
输入1:
143175=120
输入2:
5025=30
输入3:
999899=125
Sample Output
输出1:
2
输出2:
1
输出3:
4
Data Constraint
Hint
【样例解释】
样例1:14+31+75=120;样例2:5+025=30;样例3:9+9+9+89+9=125
题解:设f[i][j]表示到第i位,和为j,最少加了多少个加号
f[k][j+z]=min{f[i][j]+1},k为i+1~n,z为i+1~k位组成的数
z>s 就退出
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm> using namespace std;long long int z,s=0,h,n;char ch [1200];int f[1001][5001],a[1001],num=0,next[1010],w;int main(){ //freopen("in.txt","r",stdin); scanf("%s",ch); for(int i=0;i<strlen(ch);i++) { if(ch[i]=='=') { h=i; break; } } // for(int i=h;i>=1;i--) a[i]=ch[i-1]-'0'; for(int i=h+1;i<strlen(ch);i++) s=s*10+ch[i]-'0'; next[h]=h; for(int i=h-1;i>=1;i--) //这里用来处理前导零 { if(a[i]!=0) next[i]=i; else next[i]=next[i+1]; } memset(f,0x7f,sizeof(f)); f[0][0]=-1; for(int i=0;i<h;i++) { for(int j=0;j<=s;j++) { if(f[i][j]>2000000000)continue; w=0; for(int k=next[i+1];k<=h;k++) { w=w*10+a[k]; if(j+w<=s) f[k][j+w]=min(f[k][j+w],f[i][j]+1); else break; } } } cout<<f[h][s]; return 0;}
总结:今天题是真水,但是很不幸,我卡在了第二题,因为理解错误题意了 qwq
- 绊脚石乃是进身之阶 jzoj 2017.8.15 B组
- JZOJ 2017.8.6 B组总结
- jzoj 2017.8.7 B
- JZOJ 7.9B组
- JZOJ 4.1 B组 俄罗斯方块
- JZOJ 8.7 B组总结
- JZOJ 8.8 B组总结
- JZOJ 8.10 B组总结
- JZOJ 8.14 B组总结
- JZOJ 8.12 B组总结
- JZOJ 8.15 B组总结
- 征服困难,就是荣耀 jzoj 2017.8.16 B组
- 成功者绝不放弃 jzoj 2017.8.17 B组
- 怠惰是贫穷的制造厂 jzoj 2017.8.18 B组
- 自古成功在尝试 jzoj 2017.8.21 B组
- 两粒种子,一片森林 jzoj 2017.8.22 B组
- JZOJ 4.1 B组 无限序列
- JZOJ 4.1 B组 删数
- list,set,map和array的最全总结(1)
- zoj3432 Find the Lost Sock 亦或的运用
- Hibernate Session 操作数据库的方法详解
- (2017多校训练第七场)HDU
- Myeclipse14安装svn
- 绊脚石乃是进身之阶 jzoj 2017.8.15 B组
- Activity详细解析
- Java并发之原子性
- 笨办法学 Python · 续 练习 48:`ed`
- 不离职不离校轻松跨行Java开发
- operand should contain 1 columns(s)
- 2017816
- anaconda多环境配置
- vue-schart : vue.js 的图表组件