Codeforces Round #650 (Div. 3)

D. Task On The Boardios

題目大意:數組

 

 

 

 

想法:spa

咱們容易想到咱們每次按照字符的大小 從大往小去放字符,由於這樣能夠確保後面放的字符對以前放的字符沒有影響。code

換句話說:咱們每選取了一個「大」的字符 它都會對它以後選取的字符形成影響(由於後面選取的都是「小」的)。也就是說每選取了一個字符,咱們須要去看它肯定咱們後續須要選取的字符是什麼(同一輪肯定的字符咱們要確保它們之間沒有影響)blog

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

#define ll long long
#define ull unsigned long long
#define ls nod<<1
#define rs (nod<<1)+1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define INF 0x3f3f3f3f
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)


const double eps = 1e-8;
const int N = 2e6 + 10;
const ll MOD = 998244353;
const int mlog=20;

int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }

using namespace std;

char s[100];
int b[100],vis[2000],num[50],ans[100];

int main() {
    int t;
    scanf("%d",&t);
    while (t--) {
        int n;
        scanf("%s %d",s+1,&n);
        for (int i = 1;i <= n;i++) {
            scanf("%d",&b[i]);
            vis[i] = 0;
        }
        for (int i = 0;i < 26;i++)
            num[i] = 0;
        for (int i = 1;i <= strlen(s+1);i++) {
            num[s[i]-'a']++;
        }
        vector<int> vec;
        int m = n;
        int now = 25;
        while (m) {
            int cnt = 0;
            vector<int> pos;
            for (int i = 1;i <= n;i++) {
                if (vis[i])
                    continue;
                int sum = 0;
                for (auto &to:vec)
                    sum += abs(to-i);
                if (sum == b[i])
                    pos.push_back(i);
            }
            for (auto &to:pos) {
                vis[to] = true;
                cnt++;
                vec.push_back(to);
            }
            while (num[now] < cnt)
                now--;
            m -= cnt;
            for (auto &to:pos)
                ans[to] = (char) (now + 'a');
            now--;
        }
        for (int i = 1;i <= n;i++)
            printf("%c",ans[i]);
        printf("\n");
    }
    return 0;
}

 

 

E. Necklace Assemblyci

題目大意:字符串

 

 

 

想法:string

首先咱們應該想到 k 的因數應該都是知足的  由於是成倍的增加。it

而後咱們能夠發現字符串 io

s[1] -> s[j + 1]  

s[2] -> s[j + 2]

s[3] -> s[j + 3]

....

s[j - 1] -> s[2 * j - 1]

 

因此咱們能夠考慮字符串分紅的段數,每段有 j 個字符,這樣字符串的長度 = 每段的字符 * 分紅的段數。 

而且字符串分紅的段數是符合二分的性質的,能夠考慮二分。

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

#define ll long long
#define ull unsigned long long
#define ls nod<<1
#define rs (nod<<1)+1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define INF 0x3f3f3f3f
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)


const double eps = 1e-8;
const int N = 2e6 + 10;
const ll MOD = 998244353;
const int mlog=20;

int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }

using namespace std;

char s[2010];
int num[30];

bool check(int mid,int v) {
    for (int i = 0;i <= 25;i++) {
        mid -= num[i] / v;
        if (mid <= 0)
            return true;
    }
    return false;
}
int main() {
    int t;
    scanf("%d",&t);
    while (t--) {
        int n,k;
        scanf("%d%d",&n,&k);
        scanf("%s",s+1);
        for (int i = 0;i <= 26;i++)
            num[i] = 0;
        for (int i = 1;i <= n;i++) {
            num[s[i]-'a']++;
        }
        int ans = 0;
        for (int i = 0;i <= 25;i++) {
            ans = max(ans,num[i]);
        }
        vector<int> vec;
        for (int i = 2;i <= k;i++) {
            if (k % i == 0)
                vec.pb(i);
        }
        for (auto &v:vec) {
            int l = 1,r = n / v;
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (check(v,mid)) {
                    ans = max(ans,mid*v);
                    l = mid + 1;
                }
                else
                    r = mid - 1;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

F1. Flying Sort (Easy Version)

題目大意:

 

 

想法:

首先數組a[i]的範圍很大,咱們須要先對它進行離散化,獲得一個 1~n 的數組

而後咱們能夠發現 咱們能夠把問題轉化爲找到一組最長的不須要操做的序列 (由於這些序列不須要調整,其餘的調整就能夠了)

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

#define ll long long
#define ull unsigned long long
#define ls nod<<1
#define rs (nod<<1)+1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define INF 0x3f3f3f3f
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)


const double eps = 1e-8;
const int maxn = 1e4 + 10;
const ll MOD = 998244353;
const int mlog=20;

int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; }

using namespace std;


int a[maxn],s[maxn];
int dp[maxn];
int main() {
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        for (int i = 1;i <= n;i++) {
            cin >> a[i];
            s[i] = a[i];
            dp[i] = 0;
        }
        sort(s+1,s+1+n);
        for (int i = 1;i <= n;i++) {
            a[i] = lower_bound(s+1,s+1+n,a[i]) - s;
        }
        int Max = 1;
        for (int i = 1;i <= n;i++) {
            dp[a[i]] = dp[a[i]-1]+1;
            Max = max(Max,dp[a[i]]);
        }
        cout << n - Max << endl;
    }
    return 0;
}
相關文章
相關標籤/搜索