A:
题目:
题意:
给出一串数组,每个数字s可以变成任何数x,花费为abs(x-s),求一个数字t,使数组中的每个元素满足(t-s)<=1,求变成这样的最小花费为多少。
思路:
直接暴力即可,因为数据比较小。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn];
int n;
int main()
{
int sum=0;
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sort(a,a+n);
int ans=0x3f3f3f3f,tar;
for (int i=a[0];i<=a[n-1];i++)
{
int t=0;
for (int j=0;j<n;j++)
{
if(abs(i-a[j])>1)
t+=abs(i-a[j])-1;
}
if(ans>t)
{
ans=t;
tar=i;
}
}
printf("%d %d\n",tar,ans);
return 0;
}
B:
题目:
题意:
给出一个字符串,和一个数字k,当字符串中有连续的k个相等的字符时,字符串的等级+1,求字符串的最高等级。
思路:
暴力跑一遍。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=2*1e5+5;
char s[maxn];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s);
map<char,int>ma;
int ans=0;
for (int i=0;i<n;i++)
{
int sum=1;
int j=i;
char c=s[i];
while (i<n-1&&s[j]==s[j+1]&&sum<k)
{
j++;
sum++;
}
i=j;
if(sum>=k)
{
ma[c]++;
ans=max(ans,ma[c]);
}
}
printf("%d\n",ans);
return 0;
}
C:
题目:
题意:
给出一个范围l,r,求在这个范围组成的数字能满足数字之和为3的倍数的组合种类。
思路:
先将l到r范围内的各个余数的个数求出来,然后进行dp,设一个dp数组dp[n][3],dp[x][y]表示x个数能组成余数为y的种类数,dp数字有如下的递推式子:
dp[i][0]=(dp[i-1][0]*a[0]+dp[i-1][1]*a[2]+dp[i-1][2]*a[1])%Mod;
dp[i][1]=(dp[i-1][0]*a[1]+dp[i-1][1]*a[0]+dp[i-1][2]*a[2])%Mod;
dp[i][2]=(dp[i-1][0]*a[2]+dp[i-1][1]*a[1]+dp[i-1][2]*a[0])%Mod;
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll;
const ll Mod=1e9+7;
const int maxn=2*1e5+5;
ll n,l,r;
ll a[3];
ll dp[maxn][3];
int main()
{
scanf("%lld%lld%lld",&n,&l,&r);
a[0]=a[1]=a[2]=(r-l+1)/3;
ll yu=(r-l+1)%3;
if(yu)
{
if(yu==1)
{
a[l%3]++;
}
else
{
a[l%3]++;
a[(l+1)%3]++;
}
}
dp[1][0]=a[0];
dp[1][1]=a[1];
dp[1][2]=a[2];
for (int i=2;i<=n;i++)
{
dp[i][0]=(dp[i-1][0]*a[0]+dp[i-1][1]*a[2]+dp[i-1][2]*a[1])%Mod;
dp[i][1]=(dp[i-1][0]*a[1]+dp[i-1][1]*a[0]+dp[i-1][2]*a[2])%Mod;
dp[i][2]=(dp[i-1][0]*a[2]+dp[i-1][1]*a[1]+dp[i-1][2]*a[0])%Mod;
}
printf("%lld\n",dp[n][0]);
return 0;
}