A. Average Height(签到)
思路:
让相邻2个数相加除2为整数最多,只需要让奇数在一堆,偶数在一堆;
我做的时候排序了;其实可以分奇数偶数直接输出
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int N=4e3+10,M=1e6+10;
int a[N];
// int f[N][N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(a[i]&1)cout<<a[i]<<" ";
}
for(int i=1;i<=n;i++)
{
if(a[i]%2==0)cout<<a[i]<<" ";
}
cout<<'\n';
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
B. TMT Document(贪心)
思路
显然,如果合法的话,存在M出现的次数一定不会比T多;而且T出现次数是M的2倍;可以说非常贪心了.我证明不来;
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int N=4e3+10,M=1e6+10;
int a[N];
// int f[N][N];
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
int cntT=0,cntM=0;
for(int i=0;i<n;i++)
{
if(s[i]=='T')cntT++;
else cntM++;
if(cntM>cntT)
{
cout<<"NO"<<'\n';
return ;
}
}
cntT=0;
cntM=0;
for(int i=n-1;i>=0;i--)
{
if(s[i]=='T')cntT++;
else cntM++;
if(cntM>cntT)
{
cout<<"NO"<<'\n';
return ;
}
}
// cout<<cntT<<" "<<cntM<<'\n';
if(cntT!=2*cntM)
{
cout<<"NO\n";
return ;
}
cout<<"YES\n";
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}
C. The Sports Festival(区间DP)
思路
简单区间DP;
f [ i ][ j ]从 i 到 j 的最小答案;
很明显f [ i ] [ j ]=min( f [ i-1 ][ j ], f [ i ][ j-1 ]) + max(a[i] ~ a[j]) - min(a[i] ~ a[j]);
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long
const int N=2e3+10,M=1e6+10;
int a[N];
int f[N][N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
memset(f,0x3f,sizeof f);
for(int i=0;i<=n;i++)f[i][i]=0;
for(int len=2;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
f[i][j]=min(f[i][j-1],f[i+1][j])+a[j]-a[i];
}
cout<<f[1][n]<<'\n';
}
signed main()
{
solve();
return 0;
}