Educational Codeforces Round 161 (Rated for Div. 2) A B C

A - Tricky Template
题意:

       输入三个全部为小写的字符串a,b,c,判断是否存在模版t(若ti为小写字母,si必须与ti相同;若ti为大写字母,si必须与ti不同(C与c视作相同)) 使得a和b与模版匹配,c与模版不匹配

思路:

       如果ci==ai 或ci == bi那么对于ci来说总是会与模版匹配,如果所有位置都与模版匹配,那么就不存在这样的模版

代码:
/*
 * @Author       : 
 * @LastEditTime : 2024-01-18 23:09:58
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second 
#define pi pair<int,int>

void solve(){
    int n;cin>>n;
    string a,b,c;cin>>a>>b>>c;
    int cnt=0;
    for(int i=0;i<n;i++){
        if(c[i]==a[i]||c[i]==b[i]){
            cnt++;
        }
    }
    cout<<((cnt==n)?"NO":"YES")<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;cin>>t;while(t--)
        solve();
    return 0;
}
B - Forming Triangles
题意:

       有n根木棒,每根木棒的长度是2^ai,求出选择三根木棒使得他们可以组成三角形的方法的数量。

思路:

       2^(x-1)+2^(x-1)=2^x。组成三角形的条件是任意两边之和要大于第三边,那么不存在长度完全不相等的三条边组成三角形(两条较小的边之和不可能大于第三条边)。

所以组成三角形有两种情况:1.三条边相等即C_y^3 2.两条较大的边相等cnt*C_y^2

代码:
/*
 * @Author       : 
 * @LastEditTime : 2024-01-18 23:55:59
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second 
#define pi pair<int,int>

void solve(){
    int n;cin>>n;
    vector<int> a(n);
    map<int,int> mp;
    for(int &ai:a) {
        cin>>ai;
        mp[ai]++;
    }
    int ans=0,cnt=0,sum=0;
    for(auto [x,y]:mp){
        cnt++;
        if(cnt>1){
            ans+=sum*(y-1)*y/2;
        }
        ans+=y*(y-1)*(y-2)/6;
        sum+=y;
    }
    cout<<ans<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;cin>>t;while(t--)
        solve();
    return 0;
}
C - Closest Cities
题意:

       一条线段上有多个城市,每个城市有唯一的距离自己最近的一个城市,每个城市到达离自己最近的城市所需花费的金币个数是1,到达其他的城市所需花费的金币个数是|ai-aj|。对于m个询问,计算出从一个城市到另一个城市所需要的最少金币个数。

思路:

       从城市x到城市y过程中不会折返,故分别从前往后和从后往前两个方向计算出从城市ai到城市aj可能会多被计算上的金币个数sum。最后的答案就是|ai-aj|-sum。

代码:
/*
 * @Author       : 
 * @LastEditTime : 2024-01-19 11:59:14
 */
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second 
#define pi pair<int,int>

void solve(){
    int n;cin>>n;
    vector<int> a(n);
    for(int &ai:a) cin>>ai;
    vector<int> b(n),c(n);
    for (int i=1;i<n;i++) {
      if(i==1||a[i]-a[i-1]<a[i-1]-a[i-2])  b[i]=a[i]-a[i-1]-1;
      b[i]+=b[i-1];
    }
    for(int i=n-2;i>=0;i--) {
      if(i==n-2||a[i+1]-a[i]<a[i+2]-a[i+1])  c[i]=a[i+1]-a[i]-1;
      c[i]+=c[i+1];
    }
    int m;cin>>m;
    while(m--){
      int x,y;cin>>x>>y;
      x-=1;y-=1;
      int ans=abs(a[x]-a[y]);
      cout<<ans-(x<y?b[y]-b[x]:c[y]-c[x])<<"\n";
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;cin>>t;while(t--)
        solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值