校赛Codeforces Round #496 (Div. 3)

补题补题

出去耍了一题没写
补题补题冲冲

A题

模拟模拟模拟

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector> 
#include<queue> 
using namespace std;
#define mid 1000000007  
typedef  long long ll;
//模拟,直接写就行 
int c[1006],w[1006];
int main(){
	int a,i,t=0,p=1;
	cin>>a;
	for(i=1;i<=a;i++){
		cin>>c[i];
		if(i!=1&&c[i]==1)
		{
			t++;
			w[p++]=c[i-1];
		}
	}
	w[p]=c[i-1];
	t++;
	//处理最后一个楼梯 
	cout<<t<<endl;
	for(i=1;i<=p;i++)cout<<w[i]<<" ";
	return 0;
} 

B题

题意可知,相等的部分在最后,直接计算后面相等的最长长度就好了

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector> 
#include<queue> 
using namespace std;
#define mid 1000000007  
typedef  long long ll;
//模拟,直接写就行 
//题意可知,相等的部分在最后,直接计算后面相等的最长长度就好了 
int main(){
	int i,j;
	string s,t;
	cin>>s>>t;
	for(i=s.size()-1,j=t.size()-1;i>=0&&j>=0;i--,j--){
		if(s[i]!=t[j]){
			break;
		}
	}
	cout<<i+1+j+1;
	return 0;
} 

C题

思路
先算出2的个个次方,再用它们和元素做差,组后再在数组里面找是否存在差值
比一个一个加快得多
有个坑
我把结果放在数组里,最后再用count超时了但用map查找就过了????
STL不是慢得多么?????

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector> 
#include<map> 
using namespace std;
#define mid 1000000007  
typedef  long long ll;
//模拟,直接写就行
map<ll,ll>w;
ll p[1200006];
ll c[35];  
int main(){
	ll a,i,b,j,t=0;
	scanf("%lld",&a);
	for(i=1;i<=a;i++){
		scanf("%lld",&p[i]);
		if(!w.count(p[i]))
		w[p[i]]=1;
		else
		w[p[i]]++;
	}
	//用一个数组存2的次方
	for(i=0;i<=31;i++){
		if(i==0)
		c[i]=1;
		else
		c[i]=c[i-1]*2; 
	}//列举2的次方 
	for(i=1;i<=a;i++){
		for(j=0;j<=31;j++){
			ll k=c[j]-p[i];
			if((k==p[i]&&w[k]>=2)||(k!=p[i]&&w[k]))
			break;
			/*这里是关键,分情况讨论是避免做差后的答案与他
			本身乘积满足条件,而题意不允许与自己相乘*/
		}
		if(j==32)
		t++;
	} 
	cout<<t;
	return 0;
}

D题

把我WA瓜了

可以分析出来
有两种情况
1.本身就是三的倍数
2.为了保证答案最大,只要出现3的倍数,就应该算作一个
2.连续的三个数的和肯定可以构成3的倍数
分别为(用3的余数表示)
1 1 1
2 2 2
1 2 *
2 1 *
1 1 2
对这种情况在判断一下就可以了

很明显,这是我在网上看的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector> 
#include<map> 
using namespace std;
#define mid 1000000007  
typedef  long long ll;
int c[200006];
int main(){
	int i,t=0,sum=0,p,j,k=0;
	string s;
	cin>>s;
	for(i=0;i<s.size();i++){
		c[i]=s[i]-'0';
	}
	for(i=0;i<s.size();i++){
		sum+=c[i];
		k++;
		if(c[i]%3==0||sum%3==0||k==3){
			k=0;
			sum=0;
			t++;
		}
	}
	cout<<t;
	return 0;
}```
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值