新生赛10

新生赛 10

今天没有学什么算法,主要是做了做往年的新生赛,虽然说估计应该最高只有一两个绿题的水平,基本上是黄题,但我的水平可以保证不能稳切绿题,黄题十有八九吃罚时。: (

A

贪心,一开始还煞有介事地开了个优先队列,给数组排了个序。

事实上优先队列等于没用,数组顺序不能更改,稳稳吃到 +2

#include<bits/stdc++.h>
#define int long long
using namespace std;
template<typename T>inline void re(T &x)
{
x=0;
int f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
x*=f;
}
template<typename T>inline void wr(T x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)wr(x/10);
putchar(x%10^48);
}
int a[1000000];
int n;
signed main()
{
re(n);
for(int i=2;i<=n;++i)re(a[i]);
int ans=0;
for(register int i=2;i<=n;++i)
ans+=a[i]*i;
wr(ans);
return 0;
}

B

模拟题。类似记忆化,还好 1Y 了。

C

人类智慧构造题,但好像还是挺好构造的,只不过我想了大概四十分钟才做出来,还是太废物了。

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
x=0;
int f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
x*=f;
}
template<typename T>inline void wr(T x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)wr(x/10);
putchar(x%10^48);
}
int k;
int main()
{
re(k);
int p=0;
for(int i=1;i<=k;++i)
{
printf("%d %d %d\n",p,p+1,p+21);
if(i%2)p+=22;
else p+=41;
}
return 0;
}

D

感觉是一道大概有绿题思维难度的博弈,自己仅仅独立做出来了 14 ,后面看着题解自己思考了一些。

题意

有一个 01 串,长度为 n ,如果一个 1 的右边是 0 的话,可以向右移动这个 1 ,当一个 1 在串的最末尾的时候,可以移动它并且得到一分。

现在有 A,B 两个玩家,问如果他们都 optimally 地进行操作, 问最后谁的得分更高。

分析

首先来说,对于最右边的 1 ,如果它距离串的末尾的距离是偶数,那么当前的人去移动它就肯定是一个必胜态;反之就是一个必败态,当前的人一定不会去移动它(除非没有其他的 1 可以移动)。

1.根据以上理论我们不难知道当一个串末尾为 0 ,且有 21 的时候,一定会出现平局(无论谁先手),也可以推广偶数个 1 的情况。

2.当一个串末尾为 0 且有奇数个 1 的时候,考虑末尾的 1 出于必胜态还是必败态,如果是必胜态,那么当前的人一定会去移动它,将它变为必败态,这时候一定不会有人去移动它,而是去交替移动左边的 1 ,直到达到 ...111110 的情况为止,那么此时轮到谁先手操作需要由初始态到现在状态的操作数决定。容易思考出:此时先手的人必定会输。

3.当一个串末尾为 1 且有奇数个 1 的时候,先手必定赢,因为先手得分以后就是平局态。

4.当一个串末尾为 1 且有偶数个 1 的时候,先手先得一分,然后变成第二种情况。

Code

E

分析

这个是一眼不能贪心,所以就DP了。

图方便写了个记忆化,感觉复杂度应该挺小的,结果由于是第一次写浮点数的DP,咱判断记忆化的时候好像还不能直接用等于号,于是就 T 了两三发,索性写DP了,但是由于边界和层与层的嵌套关系没有搞得太清楚,调了很久,最后记忆化也改出来了,DP也写出来了。

细节

这个题的阶段是天数,非常明显了,然后应该从最后一天倒着枚举。

虽然看着是四层循环,但是实际上很小,可以通过。

Code

F

人类智慧题,不多赘述,吃罚时就是了。

Code

G

模拟题 O(tn) 可以通过

#include<bits/stdc++.h>
using namespace std;
inline void check(int x)
{
int i;
int ans=0;
for(i=1;i*i<x;++i)
if(x%i==0)ans+=2;
if(i*i==x)ans++;
if(x%ans==0)puts("YES");
else puts("NO");
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
check(n);
}
return 0;
}

H

模拟题

Code

#include<bits/stdc++.h>
using namespace std;
inline void solve(string s)
{
cin>>s;
int len=s.length();
if(s[5]=='l')
{
for(register int i=9;i<=len-4;++i)putchar(s[i]);
putchar('\n');
}
else
for(register int i=7;i<=len-4;++i)putchar(s[i]);
}
int main()
{
int L;
cin>>L;
L-=2;
string s;
cin>>s;
while(L--)
solve(s);
cin>>s;
return 0;
}

I

乍一眼看是个DP,结果发现好像不能重复,看了题解发现是个二分加贪心,写完了还是过不了,但倒是可以过样例,鸽了,不想改这题了。

Code

posted @   Hanggoash  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2022-10-04 Test 2022.10.04
动态线条
动态线条end
点击右上角即可分享
微信分享提示