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; }