Codeforces Round 897 (Div. 2)

A. green_gold_dog, array and permutation

A - green_gold_dog, array and permutationicon-default.png?t=N7T8https://codeforces.com/contest/1867/problem/A

题意:

给一个长度为n的序列A,需要我们构造一个长度也为n的序列B,其中,序列B必须为1-n各个数的随机顺序序列,需要使我们Ai-Bi的不同的数字数量最多,比如A是1,2,3,如果B是1,2,3,那么差就是0,0,0,不同的数字个数只有1,如果B设置为3,2,1,则差为-2,0,2,不同的数字个数为3。需要输出构造的B序列

分析:

我们使最大的数减去最小的数,第二大的数减去第二小的数,以此类推,就能得到最多不同的数字,因为这样设置之后大的减小的,差值就会进一步缩小;我们使用pair数组对应位置。

代码:

#include <stdlib.h>
#include <iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include<iomanip>
#include<queue>
#include<stack>
#define int  long long
#define endl '\n'

//cout << fixed << setprecision(2) << 3.1415 << endl;
using namespace std;

int cmp2(pair<int,int>a,pair<int,int>b)
{
    if(a.first!=b.first)return a.first>b.first;
    else return a.second<b.second;
}


void solve()
{
	int n ;
	cin>>n;
	PII a[n];
	int ans[n+1];
	for(int i=0;i<n;i++)
	{
		cin>>a[i].first;
		a[i].second=i+1;
	}
	sort(a,a+n,cmp2);
	for(int i=0;i<n;i++)
	{
		ans[a[i].second]=i+1;
	}
	for(int i=1;i<=n;i++)
	{
		cout<<ans[i]<<' ';
	}
	cout<<endl;
}

signed main()
{
	//师出彩笔 
	cin.tie(nullptr)->sync_with_stdio(0);
	int turn=1;
	cin>>turn;
	while(turn--)
	{	
		solve();
	}
}

B. XOR Palindromes

B - XOR Palindromesicon-default.png?t=N7T8https://codeforces.com/contest/1867/problem/B

题意:

题目告诉我们一个长为n的01序列,现在设定一个数字x是好的,当 存在一个长为n的并且1的个数为x的01序列 能使这个序列和所给序列按位异或之后 所得的字符串为回文串,我们辨认从0到n哪些数字为好数字,输出为一串01序列,第0位数字表示0这个数字的好坏,如果使1就是好,如果是0就是坏。

分析:

我们考虑到 对于原01序列串,如果对应位置本来就相同了,那我们构造的序列在这两个位置也需要相同,同为1或者同为0都可以(即两个0和两个1),如果对应位置不同,那我们构造的序列在这两个位置也需要不同,可以为01,也可以为10,反正都要一个0和一个1,如果n是奇数,那么最中间那位数字是是0是1都可以,它就像一个随机变量hh

所以我们就知道该如何写这段程序啦,先对应看对应位置数字不同的地方有几处,记录下来,因为这是至少要有的1的数量,此时的数量为默认对应位置数字相同都为0,然后我们可以依次增加2,这个是对应位置数字相同的加的2,将0转换为1,同时我们需要考虑到是否为奇数,如果是奇数的话,每次都可以动态+1-1,因为这一位的地方是1还是0都可以

代码:

 
#include <stdlib.h>
#include <iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include<iomanip>
#include<queue>
#include<stack>
#define int  long long
#define endl '\n'

//cout << fixed << setprecision(2) << 3.1415 << endl;
using namespace std;

void solve()
{
	int n ;
	cin>>n;
	string s;
	cin>>s;
	int a[n+1];
	int b[n+1]={0};
	for(int i=1;i<=n;i++)
	{
		a[i]=s[i-1]-'0';
	}
	int t=0,y=0,z=0;
	if(n%2==1)z=1;
	for(int i=1;i<=n/2;i++)
	{
		if(a[i]==a[n-i+1])
		{
			t++;
		}
		else {
			y++;
		}
	 } 
	for(int i=0;i<=t;i++)
	{
		b[y+2*i]=1;
		if(z==1)b[y+2*i+1]=1;
	}
	for(int i=0;i<=n;i++)
	{
		cout<<b[i];
	}
	cout<<endl;
}

signed main()
{
	//师出彩笔 
	cin.tie(nullptr)->sync_with_stdio(0);
	int turn=1;
	cin>>turn;
	while(turn--)
	{	
		solve();
	}
}

C. Salyg1n and the MEX Game

C - Salyg1n and the MEX Gameicon-default.png?t=N7T8https://codeforces.com/contest/1867/problem/C

先前吐槽:

c怎么是nmd交互题啊,第一次遇到交互题脸都被抽烂了,题目内容感觉很简单,在上网学习了交互提怎么写之后再交了一发,然后就是各种各种的懵逼,各种各种花式的错误,真是逆天,我直接一整个急急急,在本地编译运行输入输出输出都能对应上,一但交上去就不知道在输出实名东西,连整个vector有啥都给我输出去了,我直接“啊?啊?啊?啊?”怎么能输出这些呢,我就一个cout<<mmin啊,怎么输出了0还不结束呢,明目输出0我就return了,不过还好是现在遇见,至少不是赛场上遇见

题意:

爱丽丝和鲍勃在玩游戏,初始情况下,会告诉我们一个n和有n个数的数组,排列时非递减排列的,可能重复元素;爱丽丝先开始,操作是插入一个不存在于数组中的数,然后鲍勃再操作,他是可以删除一个比刚插入的那个数小的数,鲍勃不能行动或者行动了2*n+1步后会停止,此时他输出-1;

爱丽丝的游戏目的是让结束时整个数组中的MEX(最小不存在的自然数)最大,鲍勃则是想让他最小,游戏中我来扮演爱丽丝,输出爱丽丝的操作

分析:

就如果序列中没0的话爱丽丝就直接把0输出结束游戏,其他的时候就第一次输出最小的未出现的自然数,然后再一步一步往前删除,向0逼迫。

(靠,我就这个思路啊,我舅这么写的,为啥永远是错的啊艹)

代码:

#include <stdlib.h>
#include <iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include<iomanip>
#include<queue>
#include<stack>
#define int  long long
#define endl '\n'

//cout << fixed << setprecision(2) << 3.1415 << endl;
using namespace std;


void solve()
{
	int n;
        cin >> n;
        set<int> s;
        for(int i = 0; i < n; i++){
            int x;
            cin >> x;
            s.insert(x);
        }
        int last = 0;
        while(s.contains(last)) last++;
        while(last != -1)
		{
            cout << last << endl;
            cin >> last;
        }
}

signed main()
{
	//师出彩笔 
	//cin.tie(nullptr)->sync_with_stdio(0);
	
	int turn=1;
	cin>>turn;
	while(turn--)
	{	
		solve();
	}
}

CSDN:陪你一起cf

bilibili:acmer--沈幼楚

知乎:与你cf

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值