- snby 的博客
ABC369 8/31
- 2024-9-8 23:25:23 @
A - 369 X可能在a,b的左 中,右三种可能,分别判断加入set中,最后输出set的个数。
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int a,b;
cin>>a>>b;
int ans=0;
set<int> c;
if((a+b)%2==0)
{
//c.push_back((a+b)/2);
c.insert((a+b)/2);
}
c.insert(2*a-b);
c.insert(2*b-a);
cout<<c.size();
return 0;
}
B - Piano 3 对左手和右手分别顺序遍历操作求得a[i]-a[i-1],再加在一起。
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int t;
cin>>t;
vector<int> a;
vector<int> b;
for(int i=0;i<t;i++)
{
int aa;
char bb;
cin>>aa>>bb;
if(bb=='L')
{
a.push_back(aa);
}
else
{
b.push_back(aa);
}
}
int ans=0;
//sort(a.begin(),a.end());
//sort(b.begin(),b.end());
for(int i=1;i<a.size();i++)
{
//cout<<a[i]<<endl;
ans+=abs(a[i]-a[i-1]);
//cout<<ans<<endl;
}
for(int i=1;i<b.size();i++)
{
ans+=abs(b[i]-b[i-1]);
}
cout<<ans;
return 0;
}
C - Count Arithmetic Subarrays 先做预处理,用该数减去上一个数。遍历数组,在从i数开始遍历,如果j和i一样则到这一直是等差数列,即i到j为题目要求的数列。这段序列中一共有(j-i)*(j-i+1)/2个连续的要求序列,ans加上后将i=j,继续往后遍历。
#include <bits/stdc++.h>
#define int long long
using namespace std;
//const int N=1e5+10;
//int a[N][N];
signed main()
{
int t;
cin>>t;
vector<int> b;
for(int i=0;i<t;i++)
{
int tt;
cin>>tt;
b.push_back(tt);
}
for(int i=b.size()-1;i>=1;i--)
{
b[i]-=b[i-1];
//cout<<b[i]<<endl;
}
int ans=t;
int j;
//cout<<t<<endl;
//cout<<b.size();
for(int i=1;i<b.size();i=j)
{
for(j=i;j<b.size()&&b[i]==b[j];j++);
ans+=(j-i)*(j-i+1)/2;
//cout<<ans<<endl;
}
cout<<ans;
return 0;
}
D 转移公式f[i][0]=max(f[i-1][0],f[i-1][1]+exp *2) f[i][1] = max(f[i-1][1],f[i-1][0]+exp)
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int n;
cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
vector<vector<int>>dp(n+1,vector<int>(2,0));
dp[0][1]=-1e14;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=1;j++)
{
if(j==1)
{
dp[i][j]=max(dp[i-1][0]+a[i],dp[i-1][1]);
}
else
{
dp[i][j]=max(dp[i-1][1]+2*a[i],dp[i-1][0]);
}
}
}
cout<<max(dp[n][0],dp[n][1]);
return 0;
}