补题补题
出去耍了一题没写
补题补题冲冲
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;
}```