目录
显示
本次比赛难度是真的水(然而因为和noi.ac的比赛冲突,所以并没有认真做),前两道题都是送分水题。
本次月赛说明了一点:人有多大胆,题有多大分。(不少暴力的分数都超乎你的想象)
A. 终于结束的起点
题解
算法一
考虑 \(M \leq 2018\) 的情况,暴力计算可以拿 \(70\) 分。
但该算法的时间复杂度真的是题目里所说的 \(O(M^2)\) 吗?
事实上可以证明,该算法实际的复杂度上界是 \(O(6M)\),对于 \( M \leq 706150 \) 的数据绰绰有余。
#include <stdio.h>
int f[2];
int main()
{
int m;
scanf("%d",&m);
f[0]=0,f[1]=1;
for(int i=2;;i++)
{
f[i%2]=(f[0]+f[1])%m;
if((f[0]==0||f[1]==0)&&(f[0]+f[1])%m==1)
{
printf("%d\n",i);
return 0;
}
}
return 0;
}
算法二
(已经没有算法二了)
B. 跳跳!
题解
通过样例可以假设:每次让高度差值最大,可以使得体力消耗最大。
事实上,这样的猜想是正确的。
#include <iostream>
#include <algorithm>
using namespace std;
int h[305],vis[305];
int main()
{
int n;
long long ans=0;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
int curh=0;
for(int i=1;i<=n;i++)
{
int maxd=0,to;
for(int j=1;j<=n;j++)
if((!vis[j])&&abs(curh-h[j])>=maxd)
{
to=j;
maxd=abs(curh-h[j]);
}
ans+=maxd*maxd;
vis[to]=1;
curh=h[to];
}
cout<<ans<<endl;
return 0;
}
D. 不围棋
题解
算法零
考虑 \(n=1\) 的情况,直接输出 -1 -1 便可拿 \(10\) 分。