前言
最近没怎么练比赛,这把感觉打的有点(说不上来),总之被第一题摆了一下,后面的做感还是可以的,只是E题一直在超时,思路最后想到了,但是没时间写了,不然估计能再多上一点分。 (开补了)
A. tb的区间问题
第一遍一眼贪心,直接wa了,后面老老实实地枚举前后所有可能。。。
第一题还是有点难,在这个位置(我地感觉)
void solve(){
int n,k;
cin>>n>>k;
vector<LL> a(n+1,0),sum(n+1,0);
LL ans = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=a[i];
sum[i] = sum[i-1] + a[i];
}
LL num = 0;
for(int i=1;i<=k;i++){
num = max(num,sum[n-k+i]-sum[i]);
}
//分别是前k个和后k个
num = max(num,sum[n-k]);
num = max(num,ans-sum[k]);
cout<<num;
}
B tb的字符串问题
这b题感觉也不好做,后面就直接暴力,找到两个相邻且符合条件的点,向左右两边枚举,最后统计没被改变的值即可
听说标准答案是用队列还是什么的,到时候再写写
int n;
string s;
void dfs(int l,int r){
while(1){
if((s[l]=='f' && s[r]=='c') || (s[l]=='t' && s[r]=='b')){
s[l] = '*';
s[r] = '*';
l--;
r++;
}
else{
if(s[l]=='*'){
l--;
}
else if(s[r]=='*'){
r++;
}
else{
break;
}
}
}
}
void solve(){
cin>>n>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='f' && s[i+1]=='c' || (s[i]=='t' && s[i+1]=='b')){
s[i]='*';
s[i+1] = '*';
int l = i-1 ,r = i+2;
dfs(l,r);
}
}
int ans = 0;
for(int i=0;i<s.length();i++){
if(s[i]!='*') ans++;
}
cout<<ans;
}
C. tb的路径问题
肯定不可能建图,数组直接暴了,这种题目还是先写小一些的,找找规律,很快的
把1到10的数组打出来看看规律就知道了,小的数先输出,大的数找规律
void solve(){
int n;
cin>>n;
if(n==1){
cout<<0;
return;
}
if(n==2){
cout<<2;
return;
}
if(n==3){
cout<<4;
return;
}
if(n%2==0){
cout<<4;
}
else{
cout<<6;
}
}
D. tb的平方问题
er,感觉这次挺多地方考前缀和的,前缀和遍历区间和,给的数据还是很人性化的1e3(开心),直接n2暴力扫过去即可,然后找点,做差分,最后直接输出就好了
提一嘴,感觉CD比前面还AB还好做.
using LL = long long;
LL check(LL x){
int p = sqrt(x);
if(p*p==x){
return 1;
}
else{
return 0;
}
}
void solve(){
int n,q;
cin>>n>>q;
vector<LL> a(n+1,0),sum(n+1,0),cnt(n+1,0);
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i] = sum[i-1] + a[i];
}
int k =0;
for(int i=1;i<=n;i++){
for(int k=0;k<=n-i;k++){
if(check(sum[i+k]-sum[k])==1){
cnt[k+1]++;
cnt[i+k+1]--;
}
}
}
for(int i=1;i<=n;i++){
cnt[i] += cnt[i-1];
}
while(q--){
int x;
cin>>x;
cout<<cnt[x]<<endl;
}
}
E. tb的数数问题
赛后想了想,5分钟A掉了,其实代码和思路挺简单的,就是取最大,然后从1遍历,对于不行的,倍增点也直接归0,最后留下的点就是答案
void solve(){
int n;
cin>>n;
vector<int> a(n+1,0),cnt(1e6+10,0);
int num = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
num = max(num,a[i]);
cnt[a[i]]=1;
}
for(int j=1;j<=num;j++){
if(cnt[j]==1){
continue;
}
else{
for(int i=j;i<=num;i+=j){
cnt[i]=0;
}
}
}
int ans = 0;
for(int i=1;i<=num;i++){
if(cnt[i]==1){
ans++;
}
}
cout<<ans;
}