牛客2022年除夕AK场

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客2022年除夕AK场相关的知识,希望对你有一定的参考价值。

前言

最后一题有意思,然而并未AK,新年快乐啊各位coder!

A.如意(签到+思维)

题目连接

https://ac.nowcoder.com/acm/contest/28335/A

题面

思路

如果输出5,说明所有题都把你防住了,这样你就通过了0题,那么这题就通过不了。

输出0~4中任意一个数字都可以通过本题。

代码

print(0)

B.烟花(模拟)

题目连接

https://ac.nowcoder.com/acm/contest/28335/B

题面

思路

直接按照要求模拟图像就好了,只不过我们得计算好空位和字符之间的关系,详情请看代码

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
int n,m,q,a[N];

void space(int n,char c)
	for(int i = 0;i < n; ++i) printf("%c",c);


int main()

	scanf("%d",&n);
	for(int i = 0;i < n; ++i) 
		int pre_space = i;
		int dis = n-i-1;
		space(pre_space,' ');
		printf("\\\\");
		space(dis,' ');
		printf("|");
		space(dis,' ');
		printf("/\\n");
	
	space(n,'-');
	printf("O");
	space(n,'-');
	putchar('\\n');
	
	for(int i = 0;i < n; ++i) 
		int pre_space = n-i-1;
		int dis = i;
		space(pre_space,' ');
		printf("/");
		space(dis,' ');
		printf("|");
		space(dis,' ');
		printf("\\\\\\n");
	
	
	
	return 0;

C.瑞雪(小学数学)

题目连接

https://ac.nowcoder.com/acm/contest/28335/C

题面

思路

很容易发现留给小红的攒雪球的时间是小紫的时间减去1。所以直接输出 ( y ∗ a − 1 ) / x (y*a-1)/x (ya1)/x即可

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 2e6+10;
//----------------自定义部分----------------
ll x,y,a;

int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>x>>y>>a;
	ll tt = a * y - 1;
	cout<<(tt/x)<<endl;
	return 0;

D.红包(字符串+排序)

题目连接

https://ac.nowcoder.com/acm/contest/28335/D

题面

思路

我们将每一个X替换成9,然后再进行一个从前往后遍历找最大即可,注意这里数据很大,我们可以直接将其当作字符串处理,也可以当作大数处理,推荐使用python

代码

python代码

n = int(input(""))
list = []
for i in range(n):
    x = input("")
    #print(x)
    t = x.replace("X", "9")
    t = int(t)
    list.append(t)
k = int(0)
loc = int(1)
for i in range(n):
    if int(k) < int(list[i]):
        k = int(list[i])
        loc = i + 1
print(loc)

C/C++代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
struct node

    string data;
    int id;
a[MAXN];
int n;
int main()

    cin>>n;
    assert(n<=1000);
    for(int i=1;i<=n;++i)
    
        cin>>a[i].data;
        assert(a[i].data.size()<=100);
        a[i].id=i;
        for(auto &it:a[i].data)
        
            if(it=='X')it='9';
        
    
    sort(a+1,a+1+n,[](const node &A,const node &B)
        if(A.data.size()!=B.data.size())
            return A.data.size()>B.data.size();
        return A.data>B.data;
    );
    cout<<a[1].id;
    return 0;

E.春联(思维)

题目连接

https://ac.nowcoder.com/acm/contest/28335/E

题面

思路

引用一下出题人(比那名居的桃子)的:

本场唯一一个需要一定思维的题目。

我们先以下面的字符串举例:“afnabasfoab”

不难想到,最后一个’b’,谁的 t 串添加到这里谁就赢了。那么字符串标记为 a f n a b a s f o a [ b ] afnabasfoa[b] afnabasfoa[b]。其中中括号为必胜区间。

那么,这个 b 到上一个 b 之间所有的字母都是必败的。因为如果某人“不小心”取到了这些字母中的任意一个,对方只要在后面加一个 ‘b’ ,就直接到了最后一个 b 了。

因此,第五个字母 ‘b’ 后面这些字母都是必败的。字符串标记为 a f n a ( b a s f o a ) [ b ] afna(basfoa)[b] afna(basfoa)[b]。其中小括号为必败区间。

那么第四个字母’a’就是必胜的,因为只要某人取到了这个 a ,对方就不得不取后面的小括号区间的某个字母,导致失败。

以此类推,字符串可以标记为 ( a f n ) [ a ] ( b a s f o a ) [ b ] (afn)[a](basfoa)[b] (afn)[a](basfoa)[b]。标记的逻辑是:最后一个字母 c h r chr chr 为必胜,那么找到它前面离它最近的那个 c h r chr chr ,这段区间为必败。必败区间前面的那个字母为必胜,以此类推,标记出所有区间。

那么怎么评定胜负的标准呢?很简单,若第一个字母在必败区间,那么小红必败。否则小红必胜,因为小红可以直接取到第一个必败区间前面的那一个字母,迫使紫m去取必败区间。

彩蛋:如果要求每次添加的时候t都是s的子串,解法是后缀自动机next指针dag图上求sg函数,恕出题人不会qwq

代码

#include<bits/stdc++.h>
using namespace std;
int main()
    string s;
    cin>>s;
    int i,j=s.length()-1;
    for(i=j-1;i>=0;i--)
        if(s[i]==s[j])j=i-1,i=j;
    
    if(j==-1)cout<<"yukari";
    else cout<<"kou";

以上是关于牛客2022年除夕AK场的主要内容,如果未能解决你的问题,请参考以下文章

2021-2022-1 北京化工大学程序设计月赛 - 问题 G: 游戏的彩蛋 - 题解 - 哈希讲解

2021-2022-1 北京化工大学程序设计月赛 - 问题 G: 游戏的彩蛋 - 题解 - 哈希讲解

2021年度总结&&2022年展望

2021年度总结&&2022年展望

2021年度总结&&2022年展望

2021年度总结&&2022年展望