首页 > 其他分享 >Hello 2023

Hello 2023

时间:2023-01-05 20:44:28浏览次数:57  
标签:cut int ans long 2023 INF include Hello

题目链接

A

核心思路:简单的结论题就是需要RL就可以了。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e3 + 10,INF=0x3f3f3f3f;
int n, ans = -INF;
int a[N];
void solve()
{
	 int len;
	cin >> len;
	string s;
	cin >> s;
	int ans = -1;
	int flag = 0;
	for (int i = 0;i < len;i++)
	{
		if (s[i] == 'L' && s[i + 1] == 'R')
		{
			ans = i;
			break;
		}
		if (s[i] == 'R' && s[i + 1] == 'L')
		{
			flag = 1;
			break;
		}
	}
	if (flag == 1)
	{
		cout << 0 << endl;
		return ;
	}
	else if (flag == 1 && ans != -1)
	{
		cout << ans + 1 << endl;
		return;
	}
	else if (flag == 0 && ans != -1)
	{
		cout << ans + 1 << endl;
		return;
	}
	else if (flag == 0 && ans == -1)
	{
		cout << -1<<endl;
		return;
	}
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
}

B

核心思路:这是一道很好的构造题。也就是一个列方程组的过程 ,首先模拟n=3然后就是n=5的情况。我们会发现一个规律。

t bt t bt t bt ....

所以我们只需要列方程组解出来b就好了。所以还是得一步一步来,如果看不出规律的话。设参一定要注意不要搞糊涂了。一步一步来就不会错。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e3 + 10,INF=0x3f3f3f3f;
int n, ans = -INF;
int a[N];
void solve()
{
	int n;
	cin >> n;
	if (n % 2)
	{
		if (n == 3)
		{
			cout << "NO" << endl;
			return;
		}
		else
		{
			cout << "YES" << endl;
			int m = ceil((double)n / 2.0);
			int a = 1+m-n;
			double b = (m - 1);
			for (int i = 1;i <= n - 1;i++)
			{
				if (i & 1)
					cout << a << " ";
				else
					cout << b << " ";
			}
			cout << a << endl;
		}
	}
	else
	{
		int flag = 1;
		cout << "YES" << endl;
		for (int i = 1;i <= n;i++)
		{
			cout << flag << " ";
			flag = -flag;
		}
		cout << endl;
	}
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
}

C

核心思路:首先我们观察题目,看能不能抽象为数学模型和图形模型。我们首先假设\(sum[L,R]=a[L]+a[L+1]+a[L+2]+....+a[R]\).

然后我们分类讨论:

  • k<=m
    • \(a[1,k]\geq a[1,m]\Rightarrow a[k+1,m]\leq0\)
    • 因为\(k\geq1,所以我们对于任意的i属于[2,m],都有a[i,m]\leq0\)
  • k>m
    • $a[1,k]\geq a[1,m]\Rightarrow a[m+1,k]\geq 0 $
    • 所以可以得到对于任意的i属于[m+1,n],都存在\(a[m+1,i]\geq 0\)

推到了这个关键的式子整个问题就迎刃而解了,所以我们需要建立合适的数学模型。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3e6 + 10,INF=0x3f3f3f3f;
int n,m, ans = -INF;
LL a[N];
void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)cin >> a[i];
    LL sum = 0;
    multiset<int>st;
    int ans = 0;
    for (int i = m + 1; i <= n; i++) { // [m + 1,i]
        sum += a[i];
        st.insert(a[i]);
        if (sum < 0) {//我们希望大于 0 如果有小于0的地方,就给最小的一个添加上负号
            int mi = *st.begin();
            sum -= 2 * mi;
            ans++;
            st.erase(st.begin());
        }
    }
    st.clear();
    sum = 0;
    for (int i = m; i >= 2; i--) { //[i,m]
        sum += a[i];
        st.insert(a[i]);
        if (sum > 0) {
            int mx = *prev(st.end());
            sum -= 2 * mx;
            ans++;
            st.erase(prev(st.end()));
        }
    }
    cout << ans << endl;
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
}

D

核心思路:我们首先想什么情况下可以共用刀片呢,首先我们不可以砍去我们不该砍去的部分。所以我们可以使用st表来求RMQ.来判断是否是否可以共用,可以共用的话那么我们就可以省一个刀片。

所以接下来就是一个大模拟了,我们做模拟题其实可以先写题解,在写代码。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10,INF=0x3f3f3f3f;
int f[N][21],a[N],b[N];
int n,m;
void build()
{
	for (int i = 1;i <= n;i++)
		f[i][0] = b[i];
	for (int i = 1;i <= 21;i++)
	{
		for (int j = 1;j + (1 << i) - 1 <= n;j++)
		{
			f[j][i] = max(f[j][i - 1], f[j + (1 << (i-1))][i - 1]);
		}
	}
}
int query(int l, int r)
{
	int k = log2(r - l + 1);
	return max(f[l][k], f[r - (1 << k) + 1][k]);
}
void solve()
{
	cin >> n;
	for (int i = 1;i <= n;i++)
		cin >> a[i];
	for (int i = 1;i <= n;i++)
		cin >> b[i];
	cin >> m;
	map<int, int> cnt;
	for (int i = 1;i <= m;i++)
	{
		int X;
		cin >> X;
		cnt[X]++;
	}
	build();
	for (int i = 1;i <= n;i++)
	{
		if (a[i] < b[i])
		{
			cout << "NO" << endl;
			return;
		}
	}
	map<int, vector<int>> mp;
	for (int i = 1;i <= n;i++)
	{
		mp[b[i]].push_back(i);
	}
	for (auto p : mp)
	{
		int val = p.first;
		vector<int>& pos = p.second;
		vector<int> cut;
		for (auto i : pos)
		{
			if (a[i] != b[i])
				cut.push_back(i);
		}
		int need_cut = cut.size();
		for (int i = 1;i < cut.size();i++)
		{
			int L = cut[i - 1];
			int R = cut[i];
			if (query(L, R) <= val)//可以共用刀片的前提下是需要那个区间的需要小于等于我们的刀片,不然就把那些不需要切除的给切了。
			{
				need_cut--;
			}
		}
		if (need_cut > cnt[val])//这里用到了cnt
		{
			cout << "NO" << endl;
			return;
		}
	}
	cout << "YES" << endl;
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		solve();
	}
}

标签:cut,int,ans,long,2023,INF,include,Hello
From: https://www.cnblogs.com/xyh-hnust666/p/17028810.html

相关文章