2021-12-14【 Codeforces Round #758 (Div.1 + Div. 2)】【题解A-C】

A. Find Array

题目描述

给定 n,找到满足以下所有条件的任何整数数组 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an

  • 对于从 1 到 n 的每个 i,
  • 1 ≤ a i ≤ 1 0 9 1≤a_i≤10^9 1ai109
  • a 1 < a 2 < … < a n a_1<a_2<…<a_n a1<a2<<an 对于从 2 到 n 的每个 i, a i a_i ai 不能被
    a i − 1 a_i−1 ai1 整除。

可以证明这样的数组在问题的约束下总是存在的。

输入

第一行包含测试用例数 t (1≤t≤100)。 测试用例的描述如下。

每个测试用例的唯一一行包含一个整数 n (1≤n≤1000)。

保证所有测试用例的 n 之和不超过 1 0 4 10^4 104

输出

对于每个测试用例,打印 n 个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an——你找到的数组。 如果有多个数组满足所有条件,则打印其中任何一个。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;

const int maxn=1e6+5;
void solve(){
    int n;
        cin >> n;
        int a[n];
        for (int i = 2; i < n + 2; i++)
        {
            a[i - 1] = i;
            cout << a[i - 1] << " ";
        }
        cout << endl;
}

int main(){
    ios::sync_with_stdio(0);
    int t;
    cin >> t ;
    while(t--){
         solve();
    }
    return 0;
}

B. Build the Permutation

题目描述

给定三个整数 n,a,b。 确定是否存在从 1 到 n 的整数的置换 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn,使得:

恰好存在一个整数 i,其中 2 ≤ i ≤ n − 1 2≤i≤n-1 2in1,使得 p i − 1 < p i > p i + 1 p_{i-1}<p_i>p_{i+1} pi1<pi>pi+1(换句话说,恰好有一个局部最大值)。

正好有 b 个整数 i,其中 2 ≤ i ≤ n − 1 2≤i≤n−1 2in1,使得 p i − 1 > p i < p i + 1 p_{i-1}>p_i<p_{i+1} pi1>pi<pi+1(换句话说,正好有 b 个局部最小值)。

如果存在这样的排列,请找出任何这样的排列。

输入

输入的第一行包含一个整数 t (1≤t≤104)——测试用例的数量。 测试用例的描述如下。

每个测试用例的唯一一行包含三个整数 n、a 和 b( 2 ≤ n ≤ 1 0 5 , 0 ≤ a , b ≤ n 2≤n≤10^5,0≤a,b≤n 2n1050abn)。

所有测试用例的 n 之和不超过 1 0 5 10^5 105

输出

对于每个测试用例,如果请求的属性没有排列,则输出 -1。

否则,打印您找到的排列。 如果有多个这样的排列,您可以打印其中的任何一个。

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int maxn = 1e6 + 5;
int p[100010];
ll a, b, n;
void solve(){
    cin >> n >> a >> b;
    for (int i = 1; i <= n; i++)
        p[i] = i;
    if (abs(a - b) > 1 || a + b > n - 2){
        cout << "-1\n";
        return;
    }
    if (a == b)
        for (int i = 1; i <= a; i++)
            swap(p[2 * i], p[2 * i + 1]);
    else if (a < b)
        for (int i = 1; i <= b; i++)
            swap(p[2 * i - 1], p[2 * i]);
    else
        for (int i = 1; i <= a; i++)
            swap(p[n - 2 * i + 2], p[n - 2 * i + 1]);
    for (int i = 1; i <= n; i++)
        cout << p[i] << ' ';
    cout << '\n';
}

int main(){
    ios::sync_with_stdio(0);
    int t;
    cin >> t;
    while (t--){
        solve();
    }
    return 0;
}

C. Game Master

题目描述

n n n 个玩家正在玩游戏。

游戏中有两张不同的地图。对于每个玩家,我们都知道他在每张地图上的实力。当两个玩家在特定地图上战斗时,该地图上实力较高的玩家总是获胜。没有两个玩家在同一张地图上拥有相同的实力。

您是游戏大师并想组织一场比赛。总共会有 n − 1 n-1 n1场战斗。当锦标赛中的玩家不止一名时,选择任意一张地图和任意两名剩余玩家在该地图上进行战斗。失败的玩家将被淘汰出比赛。

最后,只剩下一名球员,他将被宣布为锦标赛的获胜者。为每个玩家确定他是否能赢得比赛。

输入

第一行包含一个整数 t ( 1 ≤ t ≤ 100 ) t (1≤t≤100) t(1t100)——测试用例的数量。测试用例的描述如下。

每个测试用例的第一行包含一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n (1≤n≤10^5) n(1n105)——玩家数量。

每个测试用例的第二行包含 n 个整数 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 9 , a i ≠ a j f o r i ≠ j ) a_1,a_2,…,a_n (1≤a_i≤10^9, a_i≠a_j for i≠j) a1,a2,,an(1ai109,ai=ajfori=j),其中 a i a_i ai 是第 i i i个玩家在第一张地图上的实力。

每个测试用例的第三行包含 n 个整数 b 1 , b 2 , … , b n ( 1 ≤ b i ≤ 1 0 9 , b i ≠ b j f o r i ≠ j ) b_1,b_2,…,b_n(1≤b_i≤10^9,b_i≠b_j for i≠j) b1,b2,,bn1bi109bi=bjfori=j,其中 b i b_i bi 是第二张地图上第 i i i 个玩家的实力。

保证所有测试用例的 n n n 之和不超过 1 0 5 10_5 105

输出

对于每个测试用例打印一个长度为 n n n 的字符串。如果第 i i i 个玩家可以赢得比赛,第 i i i 个字符应为“1”,否则为“0”。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int N=1e5+10;
struct point {
	int x,y;
	int id;
	int type;
}a[N];
bool cmp(point a,point b){
	return a.x<b.x;
}
bool cmp2(point a,point b){
	return a.id<b.id;
}
void solve(){
    int n;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i].x;
			a[i].id=i;
			a[i].type=0;
		}
		for(int i=1;i<=n;i++){
			cin>>a[i].y;
		}
		sort(a+1,a+1+n,cmp);
		int temp=a[n].y;
		int minn=temp;
		int ans=n;
		for(int i=n-1;i>=1;i--){
			minn=min(minn,a[i].y);
			if(a[i].y>=temp){
				temp=min(minn,temp);
				ans=i;
			}
		}
		for(int i=n;i>=ans;i--){
			a[i].type=1;
		}
		sort(a+1,a+1+n,cmp2);
		for(int i=1;i<=n;i++) cout<<a[i].type;
		cout<<endl;
}

int main(){
    ios::sync_with_stdio(0);
    int t;
    cin >> t ;
    while(t--){
         solve();
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值