好多人用截图的方式,我也试试~

A:

Codeforces Round #621 (Div. 1 + Div. 2)_字符串

 

 

 

 

 

 

Codeforces Round #621 (Div. 1 + Div. 2)_#include_02

    题意:把第一堆以外的其他堆往第一堆运,规定天数以内第一堆最多是多少

 

 

    解析:简单模拟即可

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1e2+10;
int a[maxn];
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++)
{
int mid=0;
while(a[i]>0&&d>0)
{
//cout<<d<<endl;
mid++;
d--;
if(mid==i-1)
{
a[i]--;
a[1]++;
mid=0;
}
}
}
cout<<a[1]<<endl;
}
}

Codeforces Round #621 (Div. 1 + Div. 2)_字符串_03

 

Codeforces Round #621 (Div. 1 + Div. 2)_#include_04

 

 

 

     题意:n,x,从(0,0)到达(x,0),n种跳法,问最少需要跳几次到达x点。

     解析:这个题我要重点说一下了,实在是弄得我够呛,花了两个小时来找题解,分析,自己实在是笨的要死。

        给定的n种跳法,我们只需要最大的即可。根据三角形,跳a,如果以此作为三角形,需要a+a>x,两边之和大于第三边,即:2*a>x,这个时候一上一下,只需要两步即可。对于不满足前这一条件的a,我们把它平铺就可以了,如果x%a==0,直接输出x/a,如果x%a!=0,那么就是x/a+1。为什么+1呢?比如样例x=12,   3,4,5。12%5==2,这个2怎么处理呢,我们只需要3个2就可以了,5,5,5, 把第2个5往上抬,和第三个5组成三角形即可到达x。因为12%5一定是小于5的,那么x%a+a一定是<2*a的,即一定可以构成一个三角形!+1即可。

       有个特判,如果n个跳法中出现了a==x,直接输出1即可。

       

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,x;
cin>>n>>x;
int ok=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]==x)
{
ok=1;
}
}
if(ok)
{
cout<<'1'<<endl;continue;
}
sort(a,a+n);
if(2*a[n-1]>=x)
{
cout<<"2"<<endl;continue;
}
int yu=x%a[n-1];
if(yu==0)
{
cout<<x/a[n-1]<<endl;
}
else
{
cout<<x/a[n-1]+1<<endl;
}
}
}

 

Codeforces Round #621 (Div. 1 + Div. 2)_字符串_05

Codeforces Round #621 (Div. 1 + Div. 2)_i++_06

题意:给出一个字符串,找出出现最多的子串(出现的坐标点要呈等差数列,但是对于长度为1和2的没有影响);如样例解释所示。

    解析:观察一下,其实对于这个字符串,只有长度为1的和长度为2的值得考虑。因为如果对于一个长度为3的字符串,出现两次,那么其中的长度为2的字串出现次数一定是>=2的,也就是说长度为2的一定是比它们多的,更何况len>2时还有下标点呈等差的条件限制。统计单个的很简单,而对于长度为2的,需要一个m[26][26],把每个单个的字符当作len=2的第2个字符,那么需要两个for更新每个以它为尾的字符串。出现次数:m[j][c]+=m[j],这里有一个顺序问题,即:

for(int i=0;i<len;i++)
{
int mid=s[i]-'a';
for(int j=0;j<26;j++)
m[j][mid]+=num[j];
num[mid]++;  //它放for(j)前面还是后面的问题
}

为什么要放后面呢?因为放前面的话,那么就会出现多加的现象,比如输入aa,aa的出现次数变成了3,这很明显不对。我们只是让当前的字符为第二个而已,先加的话它是没有第一个字符的基础的,和谈第二个?输入a,m[a][a]=0,而不是=1。

#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll num[26],m[26][26];
int main()
{
string s;
cin>>s;
ll len=s.length();
for(int i=0;i<len;i++)
{
int mid=s[i]-'a';
for(int j=0;j<26;j++)
m[j][mid]+=num[j];
num[mid]++;
}
ll max1=-1,max2=-1;
for(int i=0;i<26;i++)
max1=max(max1,num[i]);
for(int i=0;i<26;i++)
for(int j=0;j<26;j++)
max2=max(max2,m[i][j]);
cout<<max(max1,max2)<<endl;
}