关于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;
}