第一题
十进制转十六进制,签到题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,res;
string to;
int t;
map<char,int> mp;
int main()
{
mp['0']=mp['4']=mp['6']=mp['9']=mp['A']=mp['D']=1;
mp['8']=mp['B']=2;
cin>>n;
if(!n)
{
cout<<1;
return 0;
}
while(n)
{
t=n%16;
n/=16;
if(t>=10) to+=t-10+'A';
else to+=t+'0';
}
for(int i=0;i<to.length();i++) res+=mp[to[i]];
cout<<res;
return 0;
}
第二题
考虑相邻机器之间的最大距离,与端点的机器与1号和n号农田的距离,根据题意计算最大时间即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,k;
int tmp;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
vector<int> vc;
while(k--)
{
cin>>tmp;
vc.push_back(tmp);
}
int maxn=0;
for(int i=1;i<vc.size();i++)
maxn=max(maxn,vc[i]-vc[i-1]);
int res=ceil((maxn+1)*1.0/2);
res=max(res,vc[0]);
res=max(res,n-vc[vc.size()-1]+1);
cout<<res<<endl;
}
}
第三题
和背包问题的思考方式很像,表示在前i个数中选择出j个合法区间时,这j个区间和的最大值
对于,当考虑第i个数时,有两种情况:①第i个数为第j个区间的右端点②反之
(注:两种情况不代表选择/不选择第i个数)
由于区间长度为m,转移方程很明显
我的证明思路不太严谨,仔细想想是具有最优子结构性质的
注:用前缀和求
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5005;
int n,m,k;
ll a[N],s[N];
ll sum;
ll f[N][N];//f[i][j]前i个产生j个区间
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i],sum+=a[i];
s[i]=s[i-1]+a[i];
}
if(m*k==n)
{
cout<<sum;
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
{
f[i][j]=f[i-1][j];
if(i>=m)
f[i][j]=max(f[i][j],f[i-m][j-1]+s[i]-s[i-m]);
}
cout<<f[n][k];
}