B2
签到
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n, m;
map<int, int> mp;
vector<int> v[N];
int a[N];
int ans[N];
void solve()
{
mp.clear();
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
mp[a[i]]++;
v[a[i]].push_back(i);
}
int cnt = 0;
for (int i = 1; i <= n; i++)
cnt += (mp[i] >= m ? m : mp[i]);
cnt = cnt / m;
int p = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < v[i].size(); j++)
{
if(j < m && cnt)
{
ans[v[i][j]] = p++;
if(p == m+1)
{
cnt--;
p = 1;
}
}
else
ans[v[i][j]] = 0;
}
}
for (int i = 1; i <= n; i++)
{
cout << ans[i] << ' ';
v[i].clear();
}
cout << endl;
}
int main()
{
int T;
for (cin >> T; T--;)
{
solve();
}
return 0;
}
D1
解题思路:分奇偶讨论,如果n,m都为偶数,则只需满足k为偶数即可,如果n为奇数,需要把奇数行先填为偶数行,然后k为偶数即可。如果m为奇数,需要满足k<=(m/2)*n,且k为偶数。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
void solve()
{
int n, m, k;
cin >> n >> m >> k;
if(n&1)
{
if((k-m/2)>=0 && (k-m/2)%2==0)
puts("YES");
else
puts("NO");
}
else if(m&1)
{
if(k%2==0&&k<=(m/2)*n)
puts("YES");
else
puts("NO");
}
else
{
if(k&1)
puts("NO");
else
puts("YES");
}
}
int main()
{
int T;
for (cin >> T; T--;)
{
solve();
}
return 0;
}
D2
E
解题思路:数据为2e3,容易想到用dp,dp{i,j}表示,到当前i个元素,删掉了j个元素的最大匹配程度。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
int dp[N][N];
int a[N];
void solve()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
memset(dp, 0, sizeof dp);
for (int i = 1; i <= n; i++)
for (int j = 0; j <= i; j++)
{
if(j)
dp[i][j] = max(dp[i][j], dp[i-1][j-1]);
dp[i][j] = max(dp[i][j], dp[i - 1][j] + (a[i] == (i - j)));
}
for (int i = 1; i <= n; i++)
{
if(dp[n][i] >= k)
{
cout << i << endl;
return;
}
}
cout << -1 << endl;
}
int main()
{
int T;
for (cin >> T; T--;)
{
solve();
}
return 0;
}