A题:https://codeforces.com/contest/1272/problem/A
题意:这道题的话是让你走三个方向,然后每次只能走一步或者不走。问你走多少步。
思路:思路的话就是简单遍历,没啥可说的。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=1010;
const int inf=0x3f3f3f3f;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a[5];
for (int i=1; i<=3; i++)
cin>>a[i];
sort(a+1,a+4);
if(a[1]==a[2])
{
if(a[3]>a[2])
a[3]--;
if(a[1]<a[3])
{
a[1]++;
a[2]++;
}
}
else if(a[2]==a[3])
{
if (a[1]<a[2])
a[1]++;
if (a[2]>a[1])
{
a[2]--;
a[3]--;
}
}
else
{
a[1]++;
a[3]--;
}
int ans=a[2]-a[1]+a[3]-a[1]+a[3]-a[2];
cout<<ans<<endl;
}
return 0;
}
B题:https://codeforces.com/contest/1272/problem/B
题意:这道题的话,就是给你四个方向,每次只可以走一步,问你给你的这些方向操作能不能保证从(0,0)开始走,再走回(0,0),这期间只有(0,0)走了两次。然后如果不能保证的话,问你最少需要减少多少操作才可以实现。然后输出减少后的操作数,再输出操作的步骤。
思路:思路的话,就是遍历,然后贪心,模拟一下,具体看代码吧。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
string s;
int main()
{
int q;
cin>>q;
while(q--)
{
cin>>s;
int a=0,b=0,c=0,d=0;
int slen=s.size();
for(int i=0; i<slen; i++)
{
if(s[i]=='U')
a++;
if(s[i]=='D')
b++;
if(s[i]=='R')
c++;
if(s[i]=='L')
d++;
}
int m=min(a,b);
int n=min(c,d);
if((m+n)==0)
cout<<"0"<<endl;
else if(m==0 || n==0)
{
if(m==0)
{
cout<<"2"<<endl;
cout<<"RL"<<endl;
}
else if(n==0)
{
cout<<"2"<<endl;
cout<<"UD"<<endl;
}
}
else
{
cout<<2*(m+n)<<endl;
for(int i=0; i<m; i++)
cout<<"U";
for(int i=0; i<n; i++)
cout<<"R";
for(int i=0; i<m; i++)
cout<<"D";
for(int i=0; i<n; i++)
cout<<"L";
cout<<endl;
}
}
return 0;
}
C题:https://codeforces.com/contest/1272/problem/C
题意:这道题的话,就是给你n个字符,k个字符,问你在n个字符中含有k个字符中的字符的子集和是多少。
扫描二维码关注公众号,回复:
8682565 查看本文章
思路:思路的话,我们就遍历字符,相等的时候++,然后不难发现,规律就是slen*(slen+1)/2。所以就可以做出这道题了。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=200010;
const int inf=0x3f3f3f3f;
using namespace std;
char s[maxx];
char a[30];
int main()
{
int n,k;
cin>>n>>k;
cin>>s;
for(int i=0; i<k; i++)
cin>>a[i];
ll ans=0;
ll slen=0;
for(int i=0; i<n; i++)
{
int flag=0;
for(int j=0; j<k; j++)
{
if(s[i]==a[j])
{
flag=1;
slen++;
break;
}
}
if(!flag || i==n-1)
{
ans+=(slen*(slen+1))/2;
slen=0;
}
}
cout<<ans<<endl;
return 0;
}
D题:https://codeforces.com/contest/1272/problem/D
题意:这道题的话,是给你一个数组,其中有n个数字,然后问你最多去掉一个数字,剩下的数字的最长连续递增子序列的长度是多少。
思路:思路的话就是用dp来做,dp[][0]表示未去掉的个数,dp[][1]表示去掉一个的个数,然后判断一下即可。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=200010;
const int inf=0x3f3f3f3f;
using namespace std;
int a[maxx];
int dp[maxx][2];
int main()
{
int n,ans=0;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
dp[i][0]=1;
}
for(int i=2; i<=n; i++)
{
if(a[i]>a[i-1])
{
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=dp[i-1][1]+1;
}
if(a[i]>a[i-2])
dp[i][1]=max(dp[i][1],dp[i-2][0]+1);
ans=max(ans,max(dp[i][0],dp[i][1]));
}
cout<<ans<<endl;
return 0;
}