A题:
题意:给你n个数,你可以使得将相邻的数转移1,即一个加1,一个减1,你可以转移d次,问你a1最大是多少。
思路:这道题的话,贪心即可,从左往右枚举,能移过去多少就移过去多少。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
int a[maxx];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,d;
cin>>n>>d;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=2; i<=n; i++)
{
if(d>(i-1)*a[i])
{
a[1]+=a[i];
d-=(i-1)*a[i];
}
else
{
a[1]+=d/(i-1);
break;
}
}
cout<<a[1]<<endl;
}
return 0;
}
B题:
题意:n个数,每次可以移动到一个距离当前点ai的点,问最少几次可以从(0,0)移动到(x,0)。
思路:这道题的话,如果an里面有x,那就是一次,不然就看最大的ai,如果大于x,就是2次,小于x的话就是最小的u使得u*mx>=x中的u个。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=100010;
const int inf=0x3f3f3f3f;
using namespace std;
ll a[maxx];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,x;
cin>>n>>x;
int flag=0;
ll mx=0;
for(int i=1; i<=n; i++)
{
cin>>a[i];
if(a[i]==x)
{
flag=1;
}
mx=max(mx,a[i]);
}
if(flag)
{
cout<<"1"<<endl;
continue;
}
else
{
if(mx>x)
{
cout<<"2"<<endl;
}
else
{
ll ans=ceil(x*1.0/mx);
cout<<ans<<endl;
}
}
}
return 0;
}
C题:
题意:给你一个字符串都是小写字母,然后让你找它的子序列,使得子序列中的字符程等差序列。
思路:这道题的话,首先对于子序列来说,可以是某个字符,一个数,可以是等差序列;也可以是两个字符,两个数等差序列,所以三个字符是等差序列的条件,肯定小于等于两个字符时,所以不必分析三个字符的了。所以我们只需要统计一个字符和两个字符的大小即可。a[i]表示字符i出现的次数,b[i][j]表示序列(i,j)出现的次数。对于某个位置的字符j,b[i][j]+=a[i]。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=100010;
const int inf=0x3f3f3f3f;
using namespace std;
ll a[30],b[30][30];
string s;
int main()
{
cin>>s;
int slen=s.size();
ll ans=0;
for(int i=0; i<slen; i++)
{
for(int j=0; j<26; j++)
{
if(a[j])
b[j][s[i]-'a']+=a[j];
}
a[s[i]-'a'] ++;
ans=max(ans,a[s[i]-'a']);
}
for(int i=0; i<26; i++)
{
for(int j=0; j<26; j++)
{
ans=max(ans,b[i][j]);
}
}
cout<<ans<<endl;
return 0;
}
D题:单独写一篇博客。