https://codeforces.com/contest/1335
A, B, C, Dの4完でした。
A. Candies and Two Sisters
N個のキャンディを、になるようにaとbに分配するときの組み合わせの数。が答えになる。
B. Construct the String
Aは答えに関係ない。条件を満たす文字列を作るとき、最初のB文字はabcde……みたいにばらばらにする。以降、文字目は、文字目と等しいものをつなげていけば、どの連続するB文字を取ってもちょうどB文字バラバラになって、Bより大きい連続部分列Aでも条件を満たせる。
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int MOD = 998244353;
const int INF = 1e10;
using Graph = vector<vector<int>>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
signed main(){
int T;
cin >> T;
string alp = "abcdefghijklmnopqrstuvwxyz";
rep(t, T){
int N, A, B;
cin >> N >> A >> B;
string ans = "";
for( int i = 0; i < B; i++ ) ans += alp[i];
for( int i = B; i < N; i++ ){
ans += ans[i-B];
}
cout << ans << endl;
}
}
C. Two Teams Composing
の数字の出現回数をmapで管理して、そのvalueの最大値が2チーム目のメンバーの最大数候補になる。mapのsize>valueの最大値のときはvalueの最大値が答え、そうでないときはmapのsizeとvalueの最大値-1のうち、小さいほうが答えになる(valueの最大値から1引くのは、2チーム目に含まれる数字を全部2チーム目に使った場合1チーム目に入れることができないから)。
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int MOD = 998244353;
const int INF = 1e10;
using Graph = vector<vector<int>>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
signed main(){
int T;
cin >> T;
rep(t, T){
int N;
cin >> N;
map<int, int> num;
for( int i = 0; i < N; i++ ){
int A;
cin >> A;
num[A]++;
}
int total = (int)num.size();
int ans = 0;
for( auto p : num ){
if( ans < p.second ){
if( total > p.second ) ans = max(ans, p.second);
else ans = max(ans, min(total, p.second-1));
}
}
cout << ans << endl;
}
}
嫌な見た目(??)をしてる。
数独の仕組み的に、縦・横・3*3のハコ全部が異なるところから1つずつ適当に選んで、選んだ数字を+1すれば通る(9の場合は1にする)。
E1以降もupsolveしたら追記していきたいと思います。ねむい!