A. green_gold_dog, array and permutation
A - green_gold_dog, array and permutationhttps://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 Palindromeshttps://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 Gamehttps://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