2.19训练赛

A - Triple Metre

题解:判断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;
}

B - Counting 2

题解:判断有多少名学生的身高大于等于输入的值,用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;
	}
}

C - Neighbors

 题解:考查并查集,当成环或者一个父节点有三个子节点时输出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;
}

E - Sum of difference

题解:考查数学,利用前缀和和数学公式推导可得求和公式。

#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;
}

F - Unlucky 7

题解:找出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;
}

H - Duodecim Ferra

题解:考查组合数和数学推导

#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;
}

J - abc285_brutmhyhiizp

题解:题目大意输入一个只含大写字母的字符串,求该字符串代表的数,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;
}

K - Colorful Candies

题解:暴力会超时,所以用双指针和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;
}

L - Triangles

题解:求给出的数能组成多少个三角形,只需选取数组中两个数,判断数组中有多少个数小于这两个数之和,直到选完所有可能的两个数的组合,可以用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值