C128【?XXXX级】0311 ?组测试

发布时间 2023-03-25 16:30:16作者: 煎饼Li

欢迎到学校的OJ去切题QWQ

A - 修理牛棚 Barn Repair

这个题就非常的简单啊。首先,我们需要对牛棚里面的牛排个序。

然后,再计算出他们里面有的空隙(这样我们就可以让最长的木板长度短下来)。

最后,再从总的长度减去没有牛的地方就可以得到答案啦。

P.S. 这个题的标题是DP专题,折让机房某位神犇只得到了40分(不知道某人在标记题目的时候是怎么想的。反正我们都行习惯他的骚操作了)

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 210;

int m, s, c, tot;
int cow[N], no_use[N];

bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	freopen("barn1.in", "r", stdin);
	freopen("barn1.out", "w", stdout);
	 
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
    cin >> m >> s >> c;

    for(int i = 0; i < c; i++)
        cin >> cow[i];

    sort(cow, cow + c);

    tot = cow[c - 1] - cow[0] + 1;

    for(int i = 1; i < c; ++i)
        no_use[i] = max(0, cow[i] - cow[i - 1] - 1);

    sort(no_use + 1, no_use + c, cmp);

    for (int i = 1; i <= m - 1 && i < c; ++i)
        tot -= no_use[i];

    cout << tot << endl;

    return 0;
}

B - SR无敌1

显然答案不会超过3,因为只要前面翻转一下,后面翻转一下,再整体翻转一下就好了。答案是0和1很好判断,而当k=1,n-1,2,n-2时答案可能是2。直接手动构造一下即可。

我在这个地方是因为OJ可以看到部分题目数据看到自己缺了几种情况就给它加上了。

非常的简单(没有人在考场上做对……)

#include <bits/stdc++.h>

using namespace std;

const int N = 100 + 10;

int a[N];
int n, k, cnt;

int main()
{
	freopen("SR1.in", "r", stdin);
	freopen("SR1.out", "w", stdout);
	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin >> n >> k;
	
	if (k == 0)
	{
		cout << 0 << endl;
		return 0;
	}
	else if (n == k)
	{
		cout << 1 << endl;
		cout << 1 << " " << n << endl;
		return 0;
	}
	else if (k == 1)
	{
		cout << 2 << endl;
		cout << 1 << " " << n - k << endl;
		cout << 1 << " " << n << endl;
		return 0;
	}
	else if (n - k == 1.0 * n / 2)
	{
		cout << 3 << endl; 
		cout << 1 << " " << n / 2 << endl;
		cout << n / 2 + 1 << " " << n << endl;
		cout << 1 << " " << n << endl;
		return 0;
	}
	else if (n - k > 1.0 * n / 2)
	{
		if (k == 2)
		{
			cout << 2 << endl;
			cout << 1 << " " << 5 << endl;
			cout << 2 << " " << n << endl;
		}
		else
		{
			cout << 3 << endl; 
			cout << n - k + 1 << " " << n << endl;
			cout << 1 << " " << n - k << endl;
			cout << 1 << " " << n << endl;
		}
		return 0;
	}
	else if (n - k < 1.0 * n / 2)
	{
//		cout << 2 << endl;
		if (n - k == 1)
		{
			cout << 2 << endl;
			cout << 2 << " " << n << endl;
			cout << 1 << " " << n << endl;
		}
		else if (n - k == 2)
		{
			cout << 2 << endl;
			cout << 2 << " " << n << endl;
			cout << 1 << " " << n - 1 << endl;
		}
		else if (k >= 1.0 * n / 2)
		{
			cout << 3 << endl;
			cout << 1 << " " << n - k << endl;
			cout << n - k + 1 << " " << n << endl;
			cout << 1 << " " << n << endl;
		}
		else
		{
			cout << 2 <<endl;
			cout << 2 << " " << n << endl;
			cout << 1 << " " << n - 1 << endl;
		}
		return 0;
	}
	
	return 0;
}

D - SR无敌2

不知道为什么老师会直接把某OI的题直接搬过来然后极草的改个名字就弄出来……

我是傻逼,贪心对了,模拟挂了。还在改中。

D - SR无敌3

像我这种蒟蒻就不配做这种题。题解没代码也看不懂。

我是傻逼。

E - COW Operations

这个题的题解有代码!

这个题有一个精髓:c可以变成ow,o可以变成cw,w可以变成co。

我们可以一起来看一下它的性质:

我们惊奇地发现:(c+o, o+w, w+c) 的奇偶性自始至终都不变!

既然我们需要把字符串变成单个字符 'C',那么 (c+o) 就 (w+c) 就应该是奇数,(o+w) 就应该是偶数。

那么解法也呼之欲出了。我们使用前缀和维护 'c','o','w' 出现的次数,对于每一次询问,求出该子串里 (c+o, o+w, w+c) 的值,再判断奇偶性是否符合要求即可。

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;

int pre[N][3];

int q, l, r, c, o, w, len;

char cow[N];

int main() 
{
	freopen("cow.in", "r", stdin);
	freopen("cow.out", "w", stdout);
	
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> cow + 1;
	
	len = strlen(cow + 1);
	
	for (int i = 1; i <= len; i++) 
	{
		if (i) 
			pre[i][0] = pre[i - 1][0], pre[i][1] = pre[i - 1][1], pre[i][2] = pre[i - 1][2];
			
		if (cow[i] == 'C') 
			pre[i][0]++;
		else if (cow[i] == 'O') 
			pre[i][1]++;
		else 
			pre[i][2]++;
	}
	
	cin >> q;
	
	while (q--) 
	{
		
		cin >> l >> r;
		if (l) 
			c = pre[r][0] - pre[l - 1][0], o = pre[r][1] - pre[l - 1][1], w = pre[r][2] - pre[l - 1][2];
		else 
			c = pre[r][0], o = pre[r][1], w = pre[r][2];
			
		if ((c + o & 1) && (c + w & 1) && !(o + w & 1)) 
			cout << "Y";
		else 
			cout << "N";
	}
	
	return 0;
}

解释一下,判断他们个数奇偶的地方的代码在干什么:判断区间[l, r]中是否存在COW子序列。具体来说,如果区间内C、O、W的个数都为奇数,且O和W的个数之和为偶数,则说明区间内一定存在COW子序列,输出'Y';否则,说明区间内不存在COW子序列,输出'N'。其中,&表示按位与运算符,可以用来判断奇偶性。