河南萌新联赛2024第(三)场:河南大学

目录

B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码:

C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码: 

E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码:

F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码:

 I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)​

思路:

代码:

J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码:

L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

代码:


B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

模拟,找点,把点前面的截出来判断

代码:

#include<iostream>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, cnt=0;
string str[N];
signed main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> str[i];
	for (int i = 1; i <= n; i++)
	{
		int c = str[i].find('.');
		int k = 0;
		int flag = 1;
		int flags = 1;
		while (flags==1)
		{
			string s = str[i].substr(0, c);
			if (c == -1)
				s = str[i],flags=0;
			str[i].erase(0, c+1);
			if (s > "255"&&s.size()>=3)
			{
				flag = 0;
				break;
			}
			k++;
			c = str[i].find('.');
		}
		if (k == 4 && flag == 1)
			cnt++;
	}
	cout << cnt;
	return 0;
}

C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

 

思路:

多画几个,找规律

代码: 

#include<iostream>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, cnt=0,t;
string str[N];
void slove()
{
	cin>>n;
    if(n==0)
    {
        cout<<1<<" ";
        return;
    }
	cout << n * (n - 1) + 2 << " ";
}
signed main()
{
	cin >> t;
	while (t--)
	{
		slove();
	}
	return 0;
}

E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

线段树求区间子段

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, q;
int a[N];
struct Node
{
	int l, r;
	int len, lmax, rmax; //len 代表的就是长度
	int tmax;   //最大连续子段和
}tr[N << 2];
void pushup(Node& u, Node& l, Node& r)
{
	u.len = l.len + r.len;
	if (l.len == l.lmax) 
        u.lmax = l.len + r.lmax;
	else 
        u.lmax = l.lmax;
	if (r.len == r.rmax) 
        u.rmax = r.len + l.rmax;
	else 
        u.rmax = r.rmax;
	u.tmax = max({ l.tmax, r.tmax, l.rmax + r.lmax });
}

void pushup(int u)
{
	pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r)
{
	if (l == r) 
        tr[u] = { l ,r, 1, 1, 1, 1 };
	else
	{
		tr[u] = { l, r };
		int mid = l + r >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}

void modify(int u, int x)//更新
{
	if (tr[u].l == x && tr[u].r == x) 
	{
		if (tr[u].lmax == 1) 
            tr[u] = { x, x, 1, 0, 0, 0 };
		else 
            tr[u] = { x, x, 1, 1, 1 ,1 };
	}
	else
	{
		int mid = tr[u].l + tr[u].r >> 1;
		if (mid >= x) 
            modify(u << 1, x);
		else 
            modify(u << 1 | 1, x);
		pushup(u);
	}
}

Node query(int u, int l, int r)//询问
{
	if (l <= tr[u].l && r >= tr[u].r) 
        return tr[u];
	else
	{
		int mid = tr[u].l + tr[u].r >> 1;
		if (r <= mid) 
            return query(u << 1, l, r);
		else if (l > mid) 
            return query(u << 1 | 1, l, r);
		else
		{
			auto left = query(u << 1, l, r);
			auto right = query(u << 1 | 1, l, r);
			Node res;
			pushup(res, left, right);
			return res;
		}
	}
}
signed main()
{
	cin >> n >> q;

	build(1, 1, n);
	int op;
	while (q--)
	{
		int x, l, r;
		cin >> op;
		if (op == 1)
		{
			cin >> x;
			modify(1, x);
		}
		else
		{
			cin >> l >> r;
			cout << query(1, l, r).tmax << endl;
		}
	}
	return 0;
}

F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

0加到x,二进制第0位上每加1就变化一次,第1位上每加2就变化一次,...,第i位上每加2^i就会变化一次,即第i位上变化次数为x/(2^i),每个位上累加的和就是从0加到x变化的次数 算一下0到x和0到x+y的次数,作差就是x加到x+y变化的次数

代码:

#include<iostream>
#include<vector>
#include<map>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, t, x, y;
void slove()
{
	cin >> x >> y;
	int n = x + y;
	int sum1 = 0, sum2 = 0;
	while (x)
	{
		sum1 += x;
		x /= 2;
	}
	while (n)
	{
		sum2 += n;
		n /= 2;
	}
	cout << sum2 - sum1 << "\n";
}
signed main()
{
	cin >> t;
	while (t--)
	{
		slove();
	}
	return 0;
}

 I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

思路:

先跑一遍从1到n,求出最短路径

再跑一遍先到k再到n的最短路径

两者比较,求出最短路

代码:

#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<map>
#define int long long
#define inf 1e18
using namespace std;
const int N = 1e6+10;
int n, m,t,k;
struct node
{
	int v,c, d;
};
priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>>q;
vector<node> g[N];
int dis[N];
int book[N];
int bfs(int s,int e,int f)
{
	for(int i=1;i<=n;i++)
    {
        book[i]=0;
        dis[i]=inf;
    }
	dis[s] = 0;
	q.push({ 0,s });
	while (!q.empty())
	{
		int z = q.top().first, u = q.top().second;
		q.pop();
		if (book[u])
			continue;
		book[u] = 1;
		for (auto x : g[u])
		{
			int v = x.v, c = x.c, d = x.d;
			if (book[v])
				continue;
			if (f == 0)
			{
				if (d)
				{
					if (dis[v] > c + z)
					{
						dis[v] = c + z;
						q.push({ dis[v],v });
					}

				}
			}
			else
			{
				if (dis[v] > c + z)
				{
					dis[v] = c + z;
					q.push({ dis[v],v });
				}
			}
		}
	}
	return dis[e];
}
void slove()
{
	cin >> n >> m >> k;
	int a, b, c, d;
	for (int i = 1; i <= m; i++)
	{
		cin >> a >> b >> c >> d;
		g[a].push_back({ b,c,d });
		g[b].push_back({ a,c,d });
	}
	int tmp1 = bfs(1, n, 0);
	int tmp2 = bfs(1, k, 0);
	int tmp3 = bfs(k, n, 1);
	int ans = min(tmp1, tmp2 + tmp3);
	if (ans < inf)
		cout << ans << "\n";
	else
		cout << "-1\n";
}
signed main()
{
	t=1;
	while (t--)
	{
		slove();
	}
	return 0;
}

J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

 

思路:

模拟即可

代码:

#include<iostream>
#define int long long
using namespace std;
const int N = 1e2;
int n, m;
int a[N][N], b[N][N], c[N][N];
signed main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> a[i][j]; 
	for (int i = 1; i <= m; i++)
			for (int j = 1; j <= m; j++)
				cin >> b[i][j];
	int t = m - n + 1;
	for (int i = 1; i <= t; i++)
	{
		for (int d = 1; d <= t; d++)
		{
			c[i][d] = 0;
			for (int k = 1; k <= n; k++)
			{
				for (int j = 1; j <= n; j++)
				{
					c[i][d] += a[k][j] * b[k + i - 1][j + d - 1];
				}
			}
		}
	}
	for (int i = 1; i <= t; i++)
	{
		for (int j = 1; j <= t; j++)
			cout << c[i][j] << " ";
		cout << "\n";
	}
	return 0;
}

L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)

 

思路:

用map简单的模拟

代码:

#include<iostream>
#include<vector>
#include<map>
#define int long long
using namespace std;
const int N = 1e3+10;
int n, m, k,q, cnt=0,t;
string str[N];
map<string, string>mp1;
map<string, map<string,vector<string>>>mp2;
void slove()
{
	cin >> m >> n >> q;
	for (int i = 1; i <= m; i++)
	{
		string pub, pri;
		cin >> pub >> pri;
		mp1[pri] = pub;
	}
	for (int i = 1; i <= n; i++)
	{
		string str;
		cin >> str >> k;
		for (int j = 1; j <= k; j++)
		{
			string name;
			int d;
			cin >> name >> d;
			for (int c = 1; c <= d; c++)
			{
				string s;
				cin >> s;
				mp2[str][name].push_back(s);
			}
		}
	}
	while (q--)
	{
		string name, id, pwd;
		cin >> name >> id >> pwd;
		string fpwd = mp1[pwd];
		int flag = 0;
		for (auto i : mp2[id][name])
		{
			if (i == fpwd)
			{
				flag = 1;
				cout << "Yes\n";
				break;
			}
		}
		if (flag == 0)
			cout << "No\n";
	}
}
signed main()
{
	t = 1;
	while (t--)
	{
		slove();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值