ABC345(A-C)

A - Leftrightarrow(100 points)

语法题,输入一个字符串,判断是否是:< = \cdots= >的样式,输入后只需判断是第一个和最后一个字符是否分别为">"和"<",再判断中间是否都是"="即可。

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;

typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10;
int n,m;
void solve(){
    string s;
    cin>>s;
    if(s[0]!='<'||s[s.length()-1]!='>'){
        cout<<"No"<<endl;
        return ;
    }//判断首尾是否满足要求
    else{
        for(int i=1;i<s.length()-1;i++){
            if(s[i]!='='){
                cout<<"No"<<endl;
                return ;
            }
        }//判断中间是否满足要求
        cout<<"Yes"<<endl;
        return ;
    }
}

int main()
{
    fast();

    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

B- Integer Division Returns(200 points)

数学题,\left \lceil x \right \rceil表示不小于 x 的最小整数,向上取整

1.对于非负数,由于c++中整形除法自动向下取整,当x能整除10的时候,就是x/10,不能整除时答案为:x/10+1;

2.对于负数,刚好就是x/10,(试出来的【doge】)

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;

typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10;

void solve(){
    ll n;
    cin>>n;
    if(n%10==0||n<0){
        cout<<n/10;
    }//负数和正整除情况
    else{
        cout<<n/10+1<<endl;
    }//正数不整除情况
    return ;
}

int main()
{
    fast();

    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

C - One Time Swap(350 points)

数据比较大,如果暴力枚举每对字符,时间复杂度为:O(n^{2}),显然会TLE。但是我们发现对于一个长度为n的字符串来讲,所有选择的方式有C_{n}^{2}种,其中如果选择的字符相同,结果都只能得到原字符串,正难则反:

得到新的字符串的对数=所有选择的对数-只得到原字符串的对数

只有字符相同才会得到原串,所以我们用map储存各个字符的个数,计算每种字符交换的种类并累加:\sum C_{i}^{2},预处理时间复杂度降至O(n+k)(k是字符的种类),相减就是能得到新字符串的对数,别忘了如果有相同字符串还会得到原字符串,所以如果有相同字符串还要加1,

最最最后: 十年OI一场空,开long long 见祖宗!

#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;

typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10;

void solve(){
    string s;cin>>s;
    ll n=s.length();
    map<char,ll> mp;
    for(auto i:s)
		{
			mp[i]++;
		}
    ll ans=0;
    ll d=0;
    int key=0;
    for(auto i:mp){
        if(i.second>1)key=1;
        d+=i.second*(i.second-1)/2;
    }
    if(key==1)cout<<n*(n-1)/2-d+1<<endl;
    else cout<<n*(n-1)/2-d<<endl;
    return ;
   
}

int main()
{
    fast();

    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

D- Tiling(450 points)

数据很小,暴力枚举就行,但我不会【doge】,之后再补吧。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值