Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

时间:2024-01-21 16:13:39

A. Digits Sequence Dividing(英文速读)

练习英语速读的题,我还上来昏迷一次。。。。只要长度大于2那么一定可以等于2那么前面大于后面就行其他no

大于2的时候分成前面1个剩下后面一定是对的因为按照数字大小

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
while(n--)
{
int t;
cin>>t;
string a;
cin>>a;
if((a.size()==2&&a[0]>=a[1])||a.size()==1)
cout<<"NO\n";
else
{
cout<<"YES\n2\n";
cout<<a[0]<<" ";
for(int i=1;i<a.size();i++)
cout<<a[i];
cout<<"\n";
}
}
}

Digital root(数学)

公式为9*(k-1)+x,开long long

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
while(n--)
{
long long k,x;
cin>>k>>x;
cout<<9*(k-1)+x<<"\n";
}
}

C. Brutality(暴力?)

实际上这题我感觉暴力也行啊。。。当时还想着优化

枚举区间排序区间然后加和不就行了应该没有太大问题

我这里想了想用优先队列先预处理一下,把每个区间内的值先算好,然后最后直接加上就行

实际上这理论上已经跑了nnlogn了抱着试一试的态度没想到ac了 124ms不可思议

因为这道题的罚时的原因也是没有进前2000

代码

#include <bits/stdc++.h>
using namespace std;
priority_queue<long long> st[666666];
long long bk[666666],num[666666];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k,p=0;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>num[i];
string a;
cin>>a;
a+='#';
for(int i=0;i<a.size();i++)
{
if(a[i]!=a[i+1])
bk[i]=p,p++;
else
bk[i]=p;
}
for(int i=0;i<n;i++)
st[bk[i]].push(num[i]);
int f=1,pre=-1,mk=0;
long long sum=0;
for(int i=0;i<n;i++)
{
if(bk[i]!=pre)
pre=bk[i],f=1,mk=0;
if(f)
{
sum+=st[bk[i]].top();
st[bk[i]].pop();
mk++;
}
if(mk==k)
f=0,mk=0;
}
cout<<sum;
}

D. Compression(模拟)

题目意思实际上是把大矩阵分割成许多小矩阵每个小矩阵都是正方形,并且边长都能被大矩阵所整除。然后去模拟小矩阵里面是不是所有的数字都是一样的,不同的小矩阵可以不一样

5个for模拟瞎暴力即可

代码

#include <bits/stdc++.h>
using namespace std;
int n,mark;
string t[666666];
int dfs(int x)
{
for(int i=0;i<n;i+=x)
for(int j=0;j<n;j+=x)
{
char te=t[i][j];
for(int k=i;k<i+x;k++)
for(int m=j;m<j+x;m++)
if(t[k][m]!=te)
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++)
{
string a;
cin>>a;
for(int j=0;j<a.size();j++)
{
if(a[j]=='0')
t[i]+="0000";
if(a[j]=='1')
t[i]+="0001";
if(a[j]=='2')
t[i]+="0010";
if(a[j]=='3')
t[i]+="0011";
if(a[j]=='4')
t[i]+="0100";
if(a[j]=='5')
t[i]+="0101";
if(a[j]=='6')
t[i]+="0110";
if(a[j]=='7')
t[i]+="0111";
if(a[j]=='8')
t[i]+="1000";
if(a[j]=='9')
t[i]+="1001";
if(a[j]=='A')
t[i]+="1010";
if(a[j]=='B')
t[i]+="1011";
if(a[j]=='C')
t[i]+="1100";
if(a[j]=='D')
t[i]+="1101";
if(a[j]=='E')
t[i]+="1110";
if(a[j]=='F')
t[i]+="1111";
}
}
for(int i=1;i<=n;i++)
{
if(n%i==0)
{
if(dfs(i))
mark=i;
}
}
cout<<mark;
}