题解:判断S是不是T的字串,S的长度在1-10间,用含有4个oxx的字符串d和substr函数判断即可
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n=0,m=0;
string s,d="oxxoxxoxxoxxoxxoxxoxxoxx";
cin>>s;
if(s.size()==1){
cout<<"Yes";
return 0;
}
if(s.size()==2){
if(s=="oo"){
cout<<"No";
return 0;
}
else{
cout<<"Yes";
return 0;
}
}
for(int i=0;i<d.size();i++){
if(d.substr(i,s.size())==s){
cout<<"Yes"<<endl;
return 0;
}
}
cout<<"No"<<endl;
}
题解:判断有多少名学生的身高大于等于输入的值,用sort排序后用lower_bound函数二分查找即可,注意是返回第几位学生的身高大于等于值,所以输出N-l。
代码:
#include<bits/stdc++.h>
long long a[200005];
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
long long N,Q,k;
cin>>N>>Q;
for(int i=1;i<=N;i++){
cin>>a[i];
}
sort(a+1,a+N+1);
while(Q--){
cin>>k;
long long l=lower_bound(a+1,a+N+1,k)-a-1;
cout<<N-l<<endl;
}
}
题解:考查并查集,当成环或者一个父节点有三个子节点时输出No。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int d[N];
int p[N]; //存储每个点的祖宗节点
// 返回x的祖宗节点
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
int n, m;
cin >> n >> m;
// 初始化,假定节点编号是1~n
for (int i = 1; i <= n; i ++ ) p[i] = i;
for (int i = 1; i <= m; i ++ )
{
int a, b; cin >> a >> b;
// 合并a和b所在的两个集合:
if (find(a) == find(b)){
cout << "No" << endl;
return 0;
}
p[find(a)] = find(b);
d[a] ++;
d[b] ++;
}
for (int i = 1; i <= n; i ++ ){
if (d[i] > 2)
{
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
return 0;
}
题解:考查数学,利用前缀和和数学公式推导可得求和公式。
#include<bits/stdc++.h>
long long n,sum,a[200005],b[200005];
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1,greater<int>());
for(int i=1;i<=n;i++){
b[i]=b[i-1]+a[i];
}
for(int i=1;i<n;i++){
sum+=b[n-i]-(b[n]-b[i]);
}
cout<<sum<<endl;
}
题解:找出1-N范围内的数十进制和八进制的个位数不含有7的个数。
#include<bits/stdc++.h>
bool check1(int n){
while(n){
if(n%10==7){
return false;
}
n/=10;
}
return true;
}
bool check2(int n){
while(n){
if(n%8==7){
return false;
}
n/=8;
}
return true;
}
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++){
if(check1(i)&&check2(i)){
sum++;
}
}
cout<<sum;
}
题解:考查组合数和数学推导
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
int n;
cin>>n;
LL pre=1;
LL cur=0;
for(int i=0; i<11; i++){
cur=pre*(n-(i+1))/(i+1);
pre=cur;
}
cout<<cur<<" "<<endl;
return 0;
}
题解:题目大意输入一个只含大写字母的字符串,求该字符串代表的数,A代表1,B代表2依次类推,同时字符串的倒数第一位还要乘上26的0次方,倒数第二位要乘上26的1次方依此类推,例如AB就是1*26^1+2*26^0,结果就是28
#include<bits/stdc++.h>
long long a[200005],b[4000005],n,sum,m;
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
string s;
cin>>s;
m=s.size();
for(int i=m;i>0;i--){
long long k=pow(26,m-i);
sum+=(s[i-1]-'A'+1)*k;
}
cout<<sum;
}
题解:暴力会超时,所以用双指针和map记录该糖果的个数,res记录当前的糖果种类数,减去开头的糖果,若该值为0,糖果种类数-1,若下一个糖果值为0,加上该糖果的同时种类数+1,count表示操作后的糖果种类数,比较res和count取大的值
#include<bits/stdc++.h>
using namespace std;//思路,首先暴力N*N肯定超时,我们采取双指针方式
const int N=3*1e5+5;
typedef long long ll;
ll cnt[N];
map<ll,int> m; //因为cnt内数字范围在1-1e9,因此采用 map 来统计一段区间内已有的值
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>cnt[i];//输入
for(int i=1;i<=k;i++) m[cnt[i]]++;//统计第一次输入的值并加入map
int res=m.size();//计算此时不同的值
int count=res;//计算每次变化后不同的值,此方法是重点
for(int i=1;i<=n-k;i++){//进行的比较次数
m[cnt[i]]--;//减去第一个值
if(m[cnt[i]]==0) count--;//如果为0说明种类减少了
if(m[cnt[i+k]]==0) count++;//类似
m[cnt[i+k]]++;//加上下一个值
res=max(res,count);//每次进行比较
}
cout<<res<<endl;
return 0;
}
题解:求给出的数能组成多少个三角形,只需选取数组中两个数,判断数组中有多少个数小于这两个数之和,直到选完所有可能的两个数的组合,可以用sort排序后用lower_bound函数二分查找
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,sum=0,a[2005],k;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<n-1;i++){
for(int j=i+1;j<n;j++){
k=lower_bound(a+j+1,a+n+1,a[i]+a[j])-a-1;
sum+=k-j;
}
}
cout<<sum;
}