先随随便便写一点东西吧,毕竟只是一场div3
A. Line Breaks
思路:一道很简单的模拟题吧,就是遍历一遍,当大于x的时候就break,然后前面那个就是找到的前x个字的总长度不超过m
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
int a[200005];
string s[200005];
void solve()
{cin>>n>>m;int cnt=0;for(int i=1;i<=n;i++){cin>>s[i];}for(int i=1;i<=n;i++){if(m>=s[i].size()){m-=s[i].size();cnt++;}else{break;}}cout<<cnt<<"\n";
}signed main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>t;while(t--)solve();return 0;
}
B. Transfusion
思路:一眼分奇偶,直接去判断整个奇偶数位的和能否被整数,以及两者整除的值是否相等,如果相等就是YES,否则就是NO
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];void solve()
{cin>>n;int sum=0;int sum1=0;int sum2=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];if(i%2==1)sum1+=a[i];elsesum2+=a[i];}if(sum%n==0&&sum1/((n+1)/2)==sum2/(n/2)){cout<<"YES\n";}else{cout<<"NO\n";}
}signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>t;while(t--)solve();return 0;
}
C. Uninteresting Number
思路:首先我们发现题目上有一个重要的信息, 平方后还是一位数,那就说明,只有2或3的平方才能改变结果。能够被9整除的数都有一个特征,各位数之和加起来是9的倍数,因此我们可以先统计2和3的数量,然后对其2每次平方改变2,3每次平方改变6,那么我们完全可以统计其改变量取模9的可能性,然后对其暴力双循环,找到是否能够满足累加之前的余数能够整除9
#include<bits/stdc++.h>
using namespace std;
#define int long long int t;
int n, k;
int a[200005];
string s; void solve() { cin >> s; int sum = 0; int cnt2 = 0, cnt3 = 0; for (char c : s) { sum += c - '0'; if (c == '2') cnt2++; if (c == '3') cnt3++; } if (sum % 9 == 0) { cout << "YES\n"; return; } int mod = sum % 9; vector<int> v3, v2; int flag = 0; v2.push_back(0);v3.push_back(0);for (int i = 1; i <= cnt3; i++) { flag += 6; flag %= 9; v3.push_back(flag); } flag = 0; for (int i = 1; i <= cnt2; i++) { flag += 2; flag %= 9; v2.push_back(flag); } for (auto i : v2) { for (auto j : v3) { if ((i + j)%9 == 9 - mod) { cout << "YES\n"; return; } } } cout << "NO\n";
} signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> t; while (t--) solve(); return 0;
}
D. Digital string maximization
思路:这题需要从题目中推出一个重要的信息,我们每个位置的第一位,最多从其往后后九位决定,因此其实也就是模拟一遍即可时间复杂度为O(n)
我们往后走九位找到最大的那个,然后交换即可
#include<bits/stdc++.h>
using namespace std;void solve()
{string s;cin>>s;int pos=0;int flag=0;int n=s.size();for(int i=0;i<n;i++){flag=s[i]-'0';pos=i;for(int j=i+1;j<=min(n-1,i+9);j++){if(s[j]-'0'-(j-i)>flag){flag=s[j]-'0'-(j-i);pos=j;}}char tmp=flag+'0';for(int j=pos;j>=i+1;j--){swap(s[j],s[j-1]);}s[i]=tmp;}cout<<s<<"\n";
}signed main()
{int t;cin>>t;while(t--)solve();return 0;
}
E. Three Strings
思路:一个很简单的动态规划,我们用一个dp[i][j]表示表示a字符串用i个,j字符串用j个组成c的最大值,然后我们的dp数组也很简单
当我们的a[i+1]=c[i+j+1]的时候
dp[i+1][j]=max(dp[i+1][j],dp[i][j]+1)
同理b[j+1]=c[i+j+1]的时候
dp[i][j+1]=max(dp[i][j+1],dp[i][j]+1)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
string a,b,c;
int f[1005][1005];
void solve()
{memset(f,0,sizeof(f));cin>>a>>b>>c;int lena=a.size();int lenb=b.size();int lenc=c.size();a=' '+a;b=' '+b;c=' '+c;for(int i=0;i<=lena;i++){for(int j=0;j<=lenb;j++){f[i+1][j]=max(f[i+1][j],f[i][j]);f[i][j+1]=max(f[i][j+1],f[i][j]);if(a[i+1]==c[i+j+1]){f[i+1][j]=max(f[i+1][j],f[i][j]+1);}if(b[j+1]==c[i+j+1]){f[i][j+1]=max(f[i][j+1],f[i][j]+1);}}}cout<<lenc-f[lena][lenb]<<"\n";
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--)solve();return 0;
}
F. Maximum modulo equality
思路:一个区间内取模m等于同一个数,那这个区间内的数是一个等差数列,我们只要找到这个区间内的最大公因数即可。
耶?区间内的最大公因数?我记得你是不可变的静态数组对吧?RMQ问题,直接秒了
ST表启动
#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,q;
int a[200005];
int f[200005][20];
int l,r;
int gcd(int a,int b)
{if(b==0)return a;return gcd(b,a%b);
}
void solve()
{cin>>n>>q;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<n;i++){f[i][0]=abs(a[i+1]-a[i]);}for(int j=1;j<20;j++){for(int i=1;i+(1<<j)-1<=n-1;i++){f[i][j]=gcd(f[i][j-1],f[i+(1<<(j-1))][j-1]);}} for(int i=1;i<=q;i++){cin>>l>>r;if(l==r){cout<<"0 ";}else{r--;int k=log2(r-l+1);cout<<gcd(f[l][k],f[r-(1<<k)+1][k])<<" ";}}cout<<"\n";
}
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--)solve();return 0;
}