A. Tricky Template
题意:给三个字符串,要求判断是否存在一个字符串,前两个字符串匹配,第三个不匹配,匹配条件是大写字母不匹配,小写字母一定配
思路:。。。这个思路我有点讲不明白,比赛的时候是凭感觉写的,而且不知道是不是比赛前在看小说,静不下心,脑子昏昏沉沉的,完全凭感觉也做这题,有思路,捋不清,不过A题直接上代码吧
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void test()
{
ll n;
cin>>n;
string s1,s2,s3;
bool t=true;
cin>>s1>>s2>>s3;
for(int i=0;i<n;i++)
{
if(s1[i]==s3[i]&&s2[i]==s3[i]&&s3[i]>='A'&&s3[i]<='Z')
{
t=false;
break;
}else if(s1[i]!=s3[i]&&s2[i]!=s3[i]&&s3[i]>='a'&&s3[i]<='z')
{
t=false;
break;
}
}
if(t)
{
cout<<"No"<<endl;
return ;
}else{
cout<<"yes"<<endl;
return ;
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll t;
cin>>t;
while(t--)
test();
}
B Forming Triangles
题意,给一个数组,每个数组值都是代表2^ai长度的棍棒,要求判断随机拿三个棍棒,然后可以组成一个三角形
思路:我们自己可以列一下,发现只有满足三个长度一样的棍棒,或者是两个长度一样的棍棒,一个长度小于两个长度一样的棍棒的棍棒,这样的话,三个长度一样的棍棒计算公式是kf*(kf-1)*(kf-2)/6,而第二种情况就是从n个里抽取两个的数量,再乘以从前面小于的数目中,抽取一个的数目
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void test()
{
ll n,su=0,cn=0;
cin>>n;
vector<ll> v(n);
map<ll,ll>m;
for(int i=0;i<n;i++)
{
cin>>v[i];
m[v[i]]++;
}
sort(v.begin(),v.end());
for(auto it=m.begin();it!=m.end();it++)
{
if(it->second>=3)
{
ll kf=it->second;
su+=kf*(kf-1)*(kf-2)/6;
}
if(it->second>=2)
{
su+=it->second*(it->second-1)/2*cn;
}
cn+=it->second;
}
cout<<su<<endl;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll t;
cin>>t;
while(t--)
test();
}
C. Closest Cities//。。。最傻der的一次,在思路明确的情况下,调试,发呆,做了1个半小时。。。。
题意,每个城市都有一个最近的城市,那么可以有两个选择,要么花费一个金币去最近的城市,要么花费|yi-xi|的金币去另一个城市,给q次查询,每次给两个点,判断一个城市到另一个城市要花多少金币
思路,前缀和以及后缀和,然后再q次查询取差就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void test()
{
ll n,cn;
cin>>n;
vector<ll>v(n+1);
vector<ll>v1(n+1,INT_MAX);
vector<ll>v2(n+1,INT_MAX);
vector<ll>dp1(n+1);
vector<ll>dp2(n+2);
for(int i=1;i<=n;i++)
cin>>v[i];
cin>>cn;
v1[1]=0;
v1[2]=1;
// v1[3]=1;
for(int i=2;i<=n-1;i++)
{
ll k1=abs(v[i]-v[i-1]);
ll k2=abs(v[i]-v[i+1]);
if(k1>k2)
{
// v1[i+1]=min(v1[i+1],(ll)1);
// v1[i+1]=min(v1[i+1],(ll)1);
v1[i+1]=min((ll)1,v1[i]);
}else{
v1[i+1]=min(v1[i+1],(ll)k2);
// v1[i+1]=min(k2, v1[i+1]);
}
// if(i==n-1)
// {
// if(v1[i]==1)
// {
// v1[n]=k2;
// }else{
// v1[n]=k1;
// }
// }
}
v2[n-1]=1;
v2[n]=0;
for(int i=n-1;i>=2;i--)
{
ll k2=abs(v[i]-v[i-1]);
ll k1=abs(v[i]-v[i+1]);
if(k1>k2)
{
v2[i-1]=min((ll)1,v2[i]);
// v2[i-1]=k1;
}else{
// v2[i-1]=min((ll)1,v2[i-1]);
v2[i-1]=k2;
}
}
for(int i=1;i<=n;i++)
{
dp1[i]=dp1[i-1]+v1[i];
}
for(int i=n;i>=1;i--)
{
dp2[i]=dp2[i+1]+v2[i];
}
while(cn--)
{
ll a,b;
cin>>a>>b;
if(b>a)
cout<<dp1[b]-dp1[a]<<endl;
else{
cout<<dp2[b]-dp2[a]<<endl;
}
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ll t;
cin>>t;
while(t--)
test();
}
补题开始
浙公网安备 33010602011771号