在此记录,仅为方便复盘。
-第33场周赛
4207. 最长合法括号子序列
一个合法的括号序列满足以下条件:
序列()被认为是合法的。
如果序列X与Y是合法的,则XY也被认为是合法的。
如果序列X是合法的,则(X)也是合法的。
例如,(),()(),(())这些都是合法的。
现在,给定一个由 ( 和 ) 组成的字符串。
请你求出其中的最长合法括号子序列的长度。
注意,子序列不一定连续。
输入格式
输出格式
数据范围
输入样例1:
(()))(
输出样例1:
4
输入样例2:
()()(()(((
输出样例2:
6
#include<iostream>
using namespace std;
int main(){
char x;
int flag=0,cnt=0,max=0;
while(cin>>x){
if(x=='('){
flag++;
cnt++;
}
if(x==')'&&flag>0){
flag--;
cnt++;
}
if(flag>=0)max=cnt-flag;
}
cout<<max;
return 0;
}
4208. 电话号码
输入格式
输出格式
数据范围
输入样例1:
2
i 1 00123
m 1 00123
输出样例1:
2
m 1 00123
i 1 00123
这道题没写,之后补上
-第34场周赛
4210. 数字
输入格式
输出格式
数据范围
输入样例1:
5
输出样例1:
7/3
#include<iostream>
using namespace std;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
int a,i;
cin>>a;
int sum=0;
int b;
for(i=2;i<a;i++){
b=a;
while(b){
sum+=b%i; //短除法
b/=i;
}
}
int d=gcd(sum,a-2);
sum/=d;
a-=2;
a/=d;
cout<<sum<<"/"<<a;
return 0;
}
4211. 序列重排
输入格式
输出格式
数据范围
输入样例1:
6
4 8 6 3 12 9
输出样例1:
9 3 6 12 4 8
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
int get(ll x,ll b){
int res=0;
while(x%b==0){
res++;
x/=b;
}
return res;
}
int main(){
int n;
cin>>n;
vector<ll> t[n];
int i;
for(i=0;i<n;i++){
ll x;
cin>>x;
t[i]={get(x,2),-get(x,3),x};
}
sort(t,t+n);
for(i=0;i<n;i++){
cout<<t[i][2]<<" ";
}
return 0;
}
-第35场周赛
4213. 最小结果
输入格式
输出格式
数据范围
输入样例1:
1 1 1 1
+ + *
输出样例1:
3
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
char op[5];
LL ans=1e18;
void dfs(vector<LL> v,int u){
if(v.size()==1)ans=min(ans,v[0]);
else{
for(int i=0;i<v.size();i++){
for(int j=i+1;j<v.size();j++){
vector<LL> t;
for(int k=0;k<v.size();k++){
if(k!=i&&k!=j){
t.push_back(v[k]);
}
}
if(op[u]=='*')t.push_back(v[i]*v[j]);
else t.push_back(v[i]+v[j]);
dfs(t,u+1);
}
}
}
}
int main(){
vector<LL> v(4);
int i,j;
for(i=0;i<4;i++)cin>>v[i];
for(i=0;i<3;i++)cin>>op[i];
dfs(v,0);
cout<<ans<<endl;
return 0;
}
4214. 三元组
输出格式
数据范围
输入样例1:
5
2 4 5 4 10
40 30 20 10 40
输出样例1:
90
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int s[3001],c[3001];
const int INF=5e8;
int main(){
int n;
cin>>n;
int i;
int res=INF;
for(i=0;i<n;i++)cin>>s[i];
for(i=0;i<n;i++)cin>>c[i];
for(int j=0;j<n;j++){
int left=INF;
for(i=0;i<j;i++){
if(s[i]<s[j])left=min(left,c[i]);
}
int right=INF;
for(int k=j+1;k<n;k++){
if(s[k]>s[j])right=min(right,c[k]);
}
res=min(res,left+c[j]+right);
}
if(res==INF)res=-1;
cout<<res<<endl;
return 0;
}
-第36场周赛
没有,之后补上
-第37场周赛
4297. 截断数组
输入格式
输出格式
数据范围
输入样例1:
5
1 3 1 1 4
输出样例1:
5
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
int i;
for(i=0;i<n;i++){
cin>>a[i];
}
long long sum1=0,sum2=0,sum=0;
for(i=0;i<=n;){
if(sum1==sum2){
sum=sum1;
sum1+=a[i];
sum2+=a[n-1];
i++;
n--;
}else if(sum1>sum2){
sum2+=a[n-1];
n--;
}else if(sum1<sum2){
sum1+=a[i];
i++;
}
}
cout<<sum;
return 0;
}
4298. 搭档
输出格式
数据范围
输入样例1:
4
1 4 6 2
5
5 1 5 7 9
输出样例1:
3
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int n,m,i,j;
cin>>n;
int a[n];
for(i=0;i<n;i++){
cin>>a[i];
}
cin>>m;
int b[m];
for(i=0;i<m;i++){
cin>>b[i];
}
sort(a,a+n);
sort(b,b+m);
int ans=0;
for(i=0,j=0;i<n;){
if(j==m)break;
if(abs(a[i]-b[j])<=1){
ans++;
i++;
j++;
}else if(a[i]>b[j])j++;
else if(a[i]<b[j])i++;
}
cout<<ans;
return 0;
}