纪中C组Day One(2019)

关于Day Zero

早上十二点钟起床,吃完午饭。就坐车出发了,到这后尝试去做了一道题,结果到了晚上回去时还没有A,慌得一批。为了安慰自己,我夜宵吃了碗泡面,就睡觉了。

前言

今天,是来纪中学习的第一天。可能是不习惯吧,感到有点不舒服。不过,今天还是蛮开心的。

早上

一早被叫醒,匆匆吃完早餐后,就赶紧跑到机房开始比赛了。

题目
T1:小明解密码

有t个密码门,每个密码门上面有两个数n,m,而密码为n^m次方的值。
求每个密码门的密码。

T2:小明在边塞

从左上角走到右下角,只能向下或右走。
平面上一些点上有敌军阻拦小明经过(1),若要经过这些有敌军的点,则需花费单位为1的体力值消灭该点上的敌军。同时,在另一些点上有能量药丸(2),经过该点服用能量药丸则可增加单位为1的体力值。
初始体力值为0。
求走完后所剩的最大的体力值。

T3:小明逛超市

他知道了每样物品的单价,以及他对每样物品的需求度(对于相同的物品,需求度可以累加),他想要花费至多N元钱使得他对所买物品的需求度和最大。

T4:小明游天界

有一些景点相互连通,需要z个单位时间。
他用刚好m个单位时间到达终点,包括起点和终点最多能游览多少个不同或相同景点(重复游览相同的景点也算入答案)。
若不能用刚好m个单位时间到达终点,则输出-1。

比赛过程&&想法

一开始,看了一下第一题,用快速幂就可以。但是,我忘了快速幂!(唉,我还是太水了)
于是,我不管超时,用一个一个乘的方法对掉了样例。
由于不会快速幂,大概分数为20分。

接着是第二题,发现是dp,然后找出了规律。然后,火速打出代码过掉样例。
当时预估分100分,后来发现自己还是太弱了。

然后看了一下第三题和第四题。第三题,01背包加完全背包,完全背包忘了,先跳过。第四题,看不出是什么鬼,就样例输出加-1,就不鸟它了。
觉得打标拿不了分,所以预估分0分。

然后,我发呆了三十分钟。决定把完全背包转换成01背包试一下,接着就试了好久,最后对了样例,其它的几乎全部不对,就放弃了。
当时预估10分。

接着继续发呆,当只剩10多分钟时,第二题找到了一个错误。顿时慌得一批,觉得没了一半分,赶紧改代码,结果来不及,没了20分。
难受~~

预估分:20+50+0+10=80(感觉自己有点低估自己)
实际分:30+80+10+20=140(不过我确实水)

下午和晚上

听讲解加改题。

改A了第二第三题。第一题不知道为什么用了快速幂之后还超时,请一个大佬来看都找不出为什么,就放弃了。第四题听了之后还是很懵,然后最后也来不及做,就不做了。

送上一二三题代码。

T1(请大佬看看为何超时)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int t,n,m;
void qsm()//快速幂
{
	n%=10;
	int sum=1;
	while (m)
	{
		if (m%2==1) sum=sum*n%10;
		n=n*n%10;
		m>>=1;
	}
	printf("%d\n",sum);//输出
}
int main()
{
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout); 
	scanf("%d",&t);//读入
	for (int i=1;i<=t;i++)
	{
		scanf("%d%d",&n,&m);//读入
		qsm();
	}
	//fclose(stdin); 
	//fclose(stdout);
	return 0;
}

算了,不管了,就当我对了吧。

T2

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,f[501][501],a[501][501];
int main()
{
	//freopen("b.in","r",stdin);
	//freopen("b.out","w",stdout);
	memset(f,-127/3,sizeof(f));//处理体力值为负情况
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	{
		scanf("%d",&a[i][j]);
		if (a[i][j]==1) a[i][j]=-1;
		else if (a[i][j]==2) a[i][j]=1;
	}
	f[1][0]=0;//赋初值
	f[0][1]=0;//赋初值
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];//dp
	printf("%d",f[n][m]);
	//fclose(stdin); 
	//fclose(stdout);
	return 0;
}

T3

#include<cstdio>
#include<iostream> 
using namespace std;
int n,m,x,y,z,f[10001]; 
int main()
{
	//freopen("c.in","r",stdin);
	//freopen("c.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		if (z)//01背包的部分
		for (int j=n;j>=x;j--)
		f[j]=max(f[j],f[j-x]+y);
		else//完全背包的部分
		for (int j=x;j<=n;j++)
		f[j]=max(f[j],f[j-x]+y);
	}
	printf("%d",f[n]);
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

一天总结

感觉今天的比赛没有进入状态,特别是有的比赛习惯没有养成。比如先把所以题目看完和做完要检查。而且要调整好心理,不要因为排名较差就气馁。

所以,加油!

后续

在大佬的帮助下,A掉了第四题。
第四题是用DP来做的。

代码供上。

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,t,x[50001],y[50001],z[50001],f[1001][1001];
int main()
{
	//freopen("d.in","r",stdin);
	//freopen("d.out","w",stdout);
	scanf("%d%d%d",&n,&m,&t);
	for (int i=1;i<=t;i++)
	scanf("%d%d%d",&x[i],&y[i],&z[i]);
	f[1][0]=1;
	for (int i=0;i<=m;i++)//枚举时间
	for (int j=1;j<=t;j++)//枚举路径
	{
	   	if ((i+z[j]<=m)&&(f[x[j]][i])) f[y[j]][i+z[j]]=max(f[y[j]][i+z[j]],f[x[j]][i]+1);//dp
	   	if ((i+z[j]<=m)&&(f[y[j]][i])) f[x[j]][i+z[j]]=max(f[x[j]][i+z[j]],f[y[j]][i]+1);//因为是无向图,所以反面也要做一次dp
	}
	if (!f[n][m]) printf("-1");
	else printf("%d",f[n][m]);
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

题目博客回家再写

小明解密码
小明在边塞
小明逛超市
小明游天界

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值