C/C++教程

Codeforces Round #813 (Div. 2) A~C

本文主要是介绍Codeforces Round #813 (Div. 2) A~C,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

A. Wonderful Permutation

  

You are given a permutation p1,p2,…,pnp1,p2,…,pn of length nn and a positive integer k≤nk≤n.

In one operation you can choose two indices ii and jj (1≤i<j≤n1≤i<j≤n) and swap pipi with pjpj.

Find the minimum number of operations needed to make the sum p1+p2+…+pkp1+p2+…+pk as small as possible.

A permutation is an array consisting of nn distinct integers from 11 to nn in arbitrary order. For example, [2,3,1,5,4][2,3,1,5,4] is a permutation, but [1,2,2][1,2,2] is not a permutation (22 appears twice in the array) and [1,3,4][1,3,4] is also not a permutation (n=3n=3 but there is 44 in the array).

Input

Each test contains multiple test cases. The first line contains the number of test cases tt (1≤t≤1001≤t≤100). Description of the test cases follows.

The first line of each test case contains two integers nn and kk (1≤k≤n≤1001≤k≤n≤100).

The second line of each test case contains nn integers p1,p2,…,pnp1,p2,…,pn (1≤pi≤n1≤pi≤n). It is guaranteed that the given numbers form a permutation of length nn.

Output

For each test case print one integer — the minimum number of operations needed to make the sum p1+p2+…+pkp1+p2+…+pk as small as possible.

A

You are given a permutation p1,p2,…,pnp1,p2,…,pn of length nn and a positive integer k≤nk≤n.

In one operation you can choose two indices ii and jj (1≤i<j≤n1≤i<j≤n) and swap pipi with pjpj.

Find the minimum number of operations needed to make the sum p1+p2+…+pkp1+p2+…+pk as small as possible.

A permutation is an array consisting of nn distinct integers from 11 to nn in arbitrary order. For example, [2,3,1,5,4][2,3,1,5,4] is a permutation, but [1,2,2][1,2,2] is not a permutation (22 appears twice in the array) and [1,3,4][1,3,4] is also not a permutation (n=3n=3 but there is 44 in the array).

Input

Each test contains multiple test cases. The first line contains the number of test cases tt (1≤t≤1001≤t≤100). Description of the test cases follows.

The first line of each test case contains two integers nn and kk (1≤k≤n≤1001≤k≤n≤100).

The second line of each test case contains nn integers p1,p2,…,pnp1,p2,…,pn (1≤pi≤n1≤pi≤n). It is guaranteed that the given numbers form a permutation of length nn.

Output

For each test case print one integer — the minimum number of operations needed to make the sum p1+p2+…+pkp1+p2+…+pk as small as possible.

定义第k大的数为下,直接找前k个数中小于x的数即可,我写的倒是有一些麻烦。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#include<cmath>
#include<stack>
#include <iomanip> 
#include<unordered_map>
using namespace std;

#define int long long
#define ull unsigned long long
#define unmap unordered_map
#define endl '\n'
#define ls (p << 1)
#define rs (p << 1 | 1)
#define s_n (int)s.size()
#define two int a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);
#define one int a,b,c;cin>>a>>b>>c;add(a,b,c);
const int maxn=2e5+5,mod=1e9+7;
typedef pair<int,int> PII;

int a[110],b[110],n,k;
void solve() {
	cin>>n>>k;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        b[i]=a[i];
    }
    sort(b+1,b+1+n);
    unmap<int,int>mp;
    for(int i=1;i<=k;i++) {
        mp[b[i]]=1;
    }
    int ans=0;
    for(int i=1;i<=k;i++) {
        if(!mp[a[i]]) ans++;
    }
    cout<<ans<<endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int ONE_PIECE=1;
	cin>>ONE_PIECE;
	while(ONE_PIECE--) {
		solve();
	}
	return 0;
}

 B. Woeful Permutation

You are given a positive integer nn.

Find any permutation pp of length nn such that the sum lcm(1,p1)+lcm(2,p2)+…+lcm(n,pn)lcm⁡(1,p1)+lcm⁡(2,p2)+…+lcm⁡(n,pn) is as large as possible.

Here lcm(x,y)lcm⁡(x,y) denotes the least common multiple (LCM) of integers xx and yy.

A permutation is an array consisting of nn distinct integers from 11 to nn in arbitrary order. For example, [2,3,1,5,4][2,3,1,5,4] is a permutation, but [1,2,2][1,2,2] is not a permutation (22 appears twice in the array) and [1,3,4][1,3,4] is also not a permutation (n=3n=3 but there is 44 in the array).

Input

Each test contains multiple test cases. The first line contains the number of test cases tt (1≤t≤10001≤t≤1000). Description of the test cases follows.

The only line for each test case contains a single integer nn (1≤n≤1051≤n≤105).

It is guaranteed that the sum of nn over all test cases does not exceed 105105.

Output

For each test case print nn integers p1p1, p2p2, ……, pnpn — the permutation with the maximum possible value of lcm(1,p1)+lcm(2,p2)+…+lcm(n,pn)lcm⁡(1,p1)+lcm⁡(2,p2)+…+lcm⁡(n,pn).

If there are multiple answers, print any of them.

 

可以发现,只有每一对都是奇数和偶数想乘相加后才会是最大值,因此从小到大奇数和偶数错开排列即可。

注意n为奇数时让1与1相乘才能获得最大值

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#include<cmath>
#include<stack>
#include <iomanip> 
#include<unordered_map>
using namespace std;

#define int long long
#define ull unsigned long long
#define unmap unordered_map
#define endl '\n'
#define ls (p << 1)
#define rs (p << 1 | 1)
#define s_n (int)s.size()
#define two int a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);
#define one int a,b,c;cin>>a>>b>>c;add(a,b,c);
const int maxn=2e5+5,mod=1e9+7;
typedef pair<int,int> PII;


int n,a[maxn];
void solve() {
	cin>>n;
    queue<int>q,p;
    for(int i=1;i<=n;i++) {
        if(i&1) q.push(i);
        else p.push(i);
    }
    if(n%2==0) {
        for(int i=1;i<=n;i++) {
        if(i&1) {
            int op=p.front();
            cout<<op<<' ';
            p.pop();
        } else {
            int op=q.front();
            cout<<op<<' ';
            q.pop();
        }
        }
    } else {
        cout<<1<<' ';
        q.pop();
        for(int i=2;i<=n;i++) {
        if(i&1) {
            int op=p.front();
            cout<<op<<' ';
            p.pop();
        } else {
            int op=q.front();
            cout<<op<<' ';
            q.pop();
        }
        }
    }
    cout<<endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int ONE_PIECE=1;
	cin>>ONE_PIECE;
	while(ONE_PIECE--) {
		solve();
	}
	return 0;
}

 C. Sort Zero

You are given an array of nn positive integers a1,a2,…,ana1,a2,…,an.

In one operation you do the following:

  1. Choose any integer xx.
  2. For all ii such that ai=xai=x, do ai:=0ai:=0 (assign 00 to aiai).

Find the minimum number of operations required to sort the array in non-decreasing order.

Input

Each test contains multiple test cases. The first line contains the number of test cases tt (1≤t≤1041≤t≤104). Description of the test cases follows.

The first line of each test case contains a single integer nn (1≤n≤1051≤n≤105).

The second line of each test case contains nn positive integers a1,a2,…,ana1,a2,…,an (1≤ai≤n1≤ai≤n).

It is guaranteed that the sum of nn over all test cases does not exceed 105105.

Output

For each test case print one integer — the minimum number of operations required to sort the array in non-decreasing order.

二分答案,找到最靠后的一个数ax使得x到n满足非递减且前边全是0即可。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
#include <cmath>
#include <stack>
#include <iomanip>
#include <unordered_map>
using namespace std;

#define int long long
#define ull unsigned long long
#define unmap unordered_map
#define endl '\n'
#define ls (p << 1)
#define rs (p << 1 | 1)
#define s_n (int)s.size()

const int maxn = 2e5 + 5, mod = 1e9 + 7;
typedef pair<int, int> PII;

int n, a[maxn],b[maxn];

bool check(int x) {
    unmap<int,int>mp;
    for(int i=1;i<x;i++) mp[a[i]]=1;
    int flag = 1;
    for(int i=x;i<=n;i++) {
        if(mp[a[i]]) b[i]=0;
        else b[i]=a[i];
    }
    for(int i=x;i<n;i++) {
        if(b[i]>b[i+1]) return false;
    }
    return true;
}

void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    int l=1,r=n,k=0;
    while(l<=r) {
        int mid=(l+r)/2;
        if(check(mid)) {
            k=mid;
            r=mid-1;
        }else {
            l=mid+1;
        }
    }
    int ans=0;
    unmap<int,int>mm;
    for(int i=1;i<k;i++) {
        if(!mm[a[i]]) {
            mm[a[i]]=1;
            ans++;
        }
    }
    cout<<ans<<endl;
}

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
        int ONE_PIECE = 1;
        cin >> ONE_PIECE;
        while (ONE_PIECE--)
        {
            solve();
        }
        return 0;
    }

 

这篇关于Codeforces Round #813 (Div. 2) A~C的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!