• 洛谷 9.19 月赛部分题解


    前言:

    这算是自己在洛谷的第一场小月赛了吧。

    以前大月赛没时间打,只能打个签到题就滚粗了。

    这次下午没安排,应该可以多做几道题吧。

    T1 子弦

    Link

    题目描述:

    (Cirno) 有一个字符串 ( exttt{S}),并希望你能求出 ( exttt{S}) 出现次数最多的非空子串的出现次数,记作 (p)

    题意比较绕,据说这道题还可以用 后缀数组求解,但我太菜了不会写。

    我们最终要求的其实是出现最多的字母的次数。

    简单证明一下吧,假设我们在找出来的子串为 (S) ,在 (S) 中出现次数最多的字母为 (K),那么第一种情况就是 (K) 的出现次数为一,那么

    答案是不变的,第二种情况就是 (K) 的出现次数大于 (1) 那么,把 (K) 这个字母作为我们的子串的结果是要比 (S) 要优的。

    综上,当子串长度为 (1) 个字母的时候最优。

    Code

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n,ans,tong[30];
    char s[10000010];
    int main()
    {
    	scanf("%s",s+1);
    	n = strlen(s+1);
    	for(int i = 1; i <= n; i++)
    	{
    		tong[s[i]-'a']++;
    	}
    	for(int i = 0; i <= 25; i++)
    	{
    		ans = max(ans,tong[i]);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    

    T2 雷雨

    Link

    一句话题意:求出一个点到另外两个点的最短路径的和,重复的部分不算在其中。

    一开始我用 (BFS) 写的,调过了样例,结果交上去愉快的 (TLE) 了,后来改成 (dij) 才稳过。

    对于答案路径可以拆成三个部分,第一部分 起点 (A) 到 某一个点 (K),以及由 (K) 再到两个终点 (B,C) 的最短路径。

    先求出 (A,B,C) 到每个点的距离,然后枚举一下 中间点 (K) 来更新一下答案就行。

    Code (有点丑):

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define int long long
    int ans = 1e15;
    int n,m,a,b,c,sx,sy;
    int R[1010][1010];
    int d[3][1010][1010];
    bool vis[1000010];
    int dx[5] = {0,1,-1,0,0};
    int dy[5] = {0,0,0,1,-1};
    struct node
    {
    	int x,y;
    	node(){}
    	node(int a,int b){x = a, y = b;}
    };
    inline int read()
    {
    	int s = 0,w = 1; char ch = getchar();
    	while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
    	while(ch >= '0' && ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
    	return s * w;
    }
    void bfs(int now)
    {
    	memset(vis,0,sizeof(vis));
    	priority_queue<pair<int,int> > q;
    	if(now == 0) sx = 1, sy = a;
    	if(now == 1) sx = n, sy = b;
    	if(now == 2) sx = n, sy = c;	
    	q.push(make_pair(-R[sx][sy],(sx-1) * n + sy)); d[now][sx][sy] = R[sx][sy]; 
    	while(!q.empty())
    	{
    		int t = q.top().second; q.pop();
    		int x = t / m + 1, y = t - (x-1) * m;
    		if(y == 0) x--, y = m;
    //		cout<<now<<" "<<x<<" "<<y<<endl;
    		if(vis[t]) continue;
    		vis[t] = 1;
    		for(int i = 1; i <= 4; i++)
    		{
    			int xx = x + dx[i];
    			int yy = y + dy[i];
    			if(xx < 1 || xx > n || yy < 1 || yy > m) continue;
    			if(d[now][xx][yy] > d[now][x][y] + R[xx][yy])
    			{
    				d[now][xx][yy] = d[now][x][y] + R[xx][yy];
    				q.push(make_pair(-d[now][xx][yy],(xx-1) * n+ yy));
    			}
    		}
    	}
    }
    signed main()
    {
    	memset(d,0x3f,sizeof(d));
    	n = read(); m = read(); a = read(); b = read(); c = read();
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= m; j++)
    		{
    			R[i][j] = read();
    		}
    	}
    	bfs(0); bfs(1); bfs(2);
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= m; j++)
    		{
    			 ans = min(ans,d[0][i][j] + d[1][i][j] + d[2][i][j] - 1LL * 2 * R[i][j]);
    		}
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    后面的两道期望题,直接把我劝退了。蓝瘦。

    T3 梦原

    Link

    比赛时想不到正解,打了个链的暴力滚粗了。

    对于链的情况,树的形态是确定的,我们要求的问题就是类似于 积木大赛的那个问题。

    直接把代码粘过来就行了。

    T4 线性生物:

    Link

    考场上推了一波 subtack1 的柿子就滚粗了,后面的 (dp) 柿子带后效性就不会推了。

    (f[i]) 表示从 (i) 走到 (n) 的期望步数。

    转移就有 (f[i] = (1 - {1over 2}) imes (f[i] + 1) + (1-{1over 2}) imes(f[i+1] + 1)))

    化简一下柿子可得 (f[i] = f[i+1] + 2)

    代码就不粘了。


    总结一下,这次月赛的前两道题还算很有好的,但后面两道期望的题,直接把我劝退了。

    但很多大佬都说这套题简单,有很多大佬都 (AK) 了,哎还是自己太菜了。

    但这次应该可以涨一波估值吧,自己的已经好几周,没更新了。

  • 相关阅读:
    C#反射动态调用dll中的方法,并返回结果[转]
    DXF与Entity
    c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0);
    DBText除了左右左对齐且上下Base对齐的其对齐点为Position外,其余的都是AlignmentPoint
    C# Cast
    DataGridView选中行按从上到下或从下到上排序
    获取鼠标点相对于各屏幕、窗体和当前控件的位置
    Database本身就有TileMode的属性,我还去写了一个方法,晕!
    不知为什么,Enter键的KeyDown,KeyPress无法捕捉
    利用正则表达式对字符串进行指定替换
  • 原文地址:https://www.cnblogs.com/genshy/p/13698614.html
Copyright © 2020-2023  润新知