A - Leftrightarrow(100 points)
语法题,输入一个字符串,判断是否是:的样式,输入后只需判断是第一个和最后一个字符是否分别为">"和"<",再判断中间是否都是"="即可。
#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)
数学题,表示不小于 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)
数据比较大,如果暴力枚举每对字符,时间复杂度为:,显然会TLE。但是我们发现对于一个长度为的字符串来讲,所有选择的方式有种,其中如果选择的字符相同,结果都只能得到原字符串,正难则反:
得到新的字符串的对数=所有选择的对数-只得到原字符串的对数
只有字符相同才会得到原串,所以我们用map储存各个字符的个数,计算每种字符交换的种类并累加:,预处理时间复杂度降至(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】,之后再补吧。