A. Average Height
奇数放一组,偶数放一组。
在这里插入代码片#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
typedef long long ll;
typedef pair<int, int> PII;
int a[N], b[N], c[N];
int t, n;
int main()
{
cin >> t;
while (t -- )
{
cin >> n;
int idx1 = 0, idx2 = 0;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
if (a[i] & 1) b[++ idx1 ]= a[i];
else c[++ idx2 ] = a[i];
}
for (int i = 1; i <= idx1; i ++ ) cout << b[i] << ' ';
for (int i = 1; i <= idx2; i ++ ) cout << c[i] << ' ';
puts("");
}
return 0;
}
B. TMT Document
debug了好久,我的代码太丑了。
思路就是前后各扫一遍
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long ll;
typedef pair<int, int> PII;
char s[N];
int t, n;
int pre[N];
int main()
{
cin >> t;
while (t -- )
{
memset(pre, 0, sizeof pre);
cin >> n >> s + 1;
bool f = 1;
if (s[1] != 'T' || s[n] != 'T')
{
puts("NO");
continue;
}
int dig = 0, idx = 0;
for (int i = 1; i <= n; i ++ )
{
if (s[i] == 'T') dig ++;
else
{
pre[++ idx] = dig;
dig = 0;
}
if (i == n) pre[++ idx] = dig;
}
int idxx = 1;
for (int i = 1; i < idx; i ++ )
{
while (1)
{
if (pre[idxx])
{
pre[idxx] --;
break;
}
else idxx ++;
if (idxx > i)
{
f = 0;
break;
}
}
if (!f) break;
}
if (!f)
{
puts("NO");
continue;
}
idxx = idx;
for (int i = idx - 1; i >= 1; i -- )
{
while (1)
{
if (pre[idxx])
{
pre[idxx] --;
break;
}
else idxx --;
if (idxx == i)
{
f = 0;
break;
}
}
if (!f) break;
}
for (int i = 1; i <= idx; i ++ )
{
if (pre[i] > 0)
{
f = 0;
break;
}
}
if (f) puts("YES");
else puts("NO");
}
return 0;
}
C. The Sports Festival
区间dp
先对数组进行排序,假设smin在头部和smax不在尾部,那么samx-smin的值就会多加,最后得到的值不会是最小值。
f[i][j]为i到j的最小值f[i][j]由f[i+1][j]和f[i][j-1]的最小值加上d[j]-d[i]得到。
先枚举区间长度,再枚举起点。
#include <bits/stdc++.h>
using namespace std;
const int N = 2020;
typedef long long ll;
typedef pair<int, int> PII;
int n;
ll d[N];
ll dp[N][N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> d[i];
sort(d + 1, d + n + 1);
for (int l = 2; l <= n; l ++ )
for (int i = 1; i + l - 1 <= n; i ++ )
dp[i][i + l - 1] = min(dp[i + 1][i + l - 1], dp[i][i + l - 2]) + d[i + l - 1] - d[i];
cout << dp[1][n] << endl;
return 0;
}