【CSDN竞赛】第九期解题报告

18 篇文章 0 订阅
17 篇文章 0 订阅

这应该是站内相对详细的解题报告吧。
转载思路请@本人。

感想

关于自己

这一次排名第三,原因是第四题的某个变量打错,调了几分钟,浪费了时间。
可能是我做的比较快(也可能是其他原因),我并没有遇到提交不上题目的问题。
下一次比赛是在下一个周日,争取前三。

关于平台

还是那句话:难度安排需要注意
不过这次题目考察的算法确实广了一点。
听说一些人在代码界面无法提交,一直显示加载还是什么。
还有一些人代码一直运行却没提示时间超限,也无法保存。
考试结束给出的测评报告排名不准,可能是刚出成绩就出了测评报告导致的(这个问题出现了很多次,一直没说)。
不过总体也有所进步,希望 C S D N CSDN CSDN能越做越好。

第一题 小艺读书(难度:入门)

题目描述

书是人类进步的阶梯。 小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。 小艺想知道一本 n n n页的书她会在周几读完。

100分做法

按照题意模拟即可。可以先处理一周读不完的情况,使其变成一周内读完。
C + + C++ C++代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a[8]={};
	scanf("%d",&n);
	for(int i=1;i<=7;i++)
	{
		scanf("%d",&a[i]);
		a[0]+=a[i];
	}
	n%=a[0];
	for(int i=1;i<=7;i++)
	{
		n-=a[i];
		if(n<=0)
		{
			printf("%d\n",i);
			return 0;
		}
	}
}

第二题 鬼画符门之宗门大比(难度:简单)

题目描述

给定整数序列A。求在整数序列 A A A中连续权值最大的子序列的权值。

100分做法1

发现数据范围很小,所以考虑先算出前缀和,然后枚举两个端点,求最大值。

100分做法2

我们记 1 1 1~ i i i的和为 s i s_i si,则区间 [ i , j ] [i,j] [i,j]的和可以表示为 s i − s j − 1 s_i-s_{j-1} sisj1
要求最大子序列的和,就是求对于每个 s i s_i si s i − s x s_i-s_x sisx的最大值。
要想让 s i − s x s_i-s_x sisx最大化,就得让 s x s_x sx最小,所以记录 1 1 1~ i − 1 i-1 i1中最小的 s x s_x sx,然后求出的 s i − s x s_i-s_x sisx就是当前最大值。
把所有的当前最大值取 m a x max max即为答案。

C + + C++ C++代码如下:

#include<bits/stdc++.h>
using namespace std;
long long a[100005],mx=-1e9,ls=0;
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		a[i]+=a[i-1];
		mx=max(mx,a[i]-ls);
		ls=min(ls,a[i]);
	}
	printf("%lld\n",mx);
}

第三题 硬币划分(难度:中等)

题目描述

1 1 1分, 2 2 2分, 5 5 5分, 10 10 10分四种硬币,每种硬币数量无限,给定 n n n分钱 ( n ≤ 1 0 5 ) (n\leq10^5) (n105),有多少中组合可以组成 n n n分钱? ( ( (答案 m o d mod mod 1 0 9 + 7 ) 10^9+7) 109+7)

100分做法

动态规划经典题。
类比完全背包,这四种硬币就相当于物品,钱相当于背包容量。
我们将完全背包中的取 m a x max max操作改成加就变成了求方案数。
相信大家都会完全背包。

C + + C++ C++代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[5]={0,1,2,5,10},dp[100005]={};
int n;
int main()
{
	scanf("%d",&n);
	dp[0]=1;
	for(int i=1;i<=4;i++)
	{
		for(int j=a[i];j<=n;j++)
		{
			dp[j]+=dp[j-a[i]];
			dp[j]%=1000000007;
		}
	}
	printf("%d\n",dp[n]);
}

第四题 饿龙咆哮-逃离城堡(难度:简单~中等)

题目描述

小艺酱误入龙族结界,被恶龙带回城堡,小艺酱决定逃离城堡,逃离龙族结界.。
总路程为 c c c, 小艺酱的速度是 v p vp vp,饿龙速度为 v d vd vd。饿龙会在 t t t小时后发现小艺酱出逃。小艺酱担心自己跑不出去,准备了好多珍宝。 每当饿龙追上自己的时候小艺酱就会丢下一个珍宝,饿龙捡到珍宝会返回自己的城堡进行研究,研究f小时后,再出城堡追赶小艺。小艺想知道自己至少需要丢多少珍宝才能让自己安全逃出结界。

100分做法

题目比较长,大概就是一种追及问题,可以用贪心算法解决(就是模拟)。
其实也可以打动态规划,不过没必要。
注意小艺的速度和饿龙的速度,如果 v q ≤ v p vq\leq vp vqvp t > 0 t>0 t>0,答案为 0 0 0
计算中会出现小数,所以用浮点型存。

C + + C++ C++代码如下:

#include<bits/stdc++.h>
using namespace std;
double c,vp,vd,t,f;
int main()
{
	scanf("%lf%lf%lf%lf%lf",&vp,&vd,&t,&f,&c);
	double s=vp*t;
	int ans=0;
	if(vp>=vd)
	{
		printf("0\n");
		return 0;
	}
	while(s<c)
	{
		double tt=s/(vd-vp);
		s+=vp*tt;
		if(s>=c)
		{
			printf("%d\n",ans);
			return 0;
		}
		ans++;
		s+=vp*tt;
		s+=vp*f;
	}
	printf("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值