先随随便便写一点东西吧,毕竟只是一场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];
else
sum2+=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;
}