https://www.acwing.com/activity/content/1853/
考研中,目前每周只打周赛。其他时间不太刷算法题。
4425. 改变数字
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
string s; cin>>s;
int w=min(s[0]-'0',9-(s[0]-'0'));
if(w==0) cout<<9;
else cout<<w;
for(int i=1;i<s.size();i++) cout<<min(s[i]-'0',9-(s[i]-'0'));
return 0;
}
4426. 整除子串【思维】
对于这种题就是打表找规律。发现被4整除的数的结尾是啥。然后根据规律计数即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
int n,m,t;
map<string,int>mp;
int main(void)
{
string s; cin>>s;
for(int i=0;i<=100;i++)
{
string temp=to_string(i);
while(temp.size()<2) temp="0"+temp;
if(i%4==0) mp[temp]=1;
}
LL ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0') ans++;
if(s[i]=='4') ans++;
if(s[i]=='8') ans++;
if(i)
{
string temp;
temp+=s[i-1];
temp+=s[i];
if(mp[temp]) ans+=i;
}
}
cout<<ans;
return 0;
}
4427. 树中节点和【贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
const int inf=0x3f3f3f3f;
typedef long long int LL;
int n,h[N],e[N],ne[N],idx;
int s[N];
LL ans;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int deep,int last_s)
{
if(deep&1)
{
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
dfs(j,deep+1,s[u]);
}
}
else
{
int p=inf;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
dfs(j,deep+1,0);
p=min(p,s[j]-last_s);
}
if(p<0) ans=-1e18;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
ans+=s[j]-last_s-p;
}
if(p!=inf) ans+=p;
}
}
int main(void)
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=2;i<=n;i++)
{
int p; cin>>p;
add(p,i);
}
for(int i=1;i<=n;i++) cin>>s[i];
ans=s[1];
dfs(1,1,0);
if(ans<0) ans=-1;
cout<<ans;
return 0;
}