1.最小值
4311. 最小值 - AcWing题库
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
double res=1e8;
while (n -- )
{
double a,b;
cin>>a>>b;
res=min(res,a/b);
}
printf("%.6lf",m*res);
return 0;
}
2.出现次数
4312. 出现次数 - AcWing题库
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
char s[N],t[N];
int ne[N];
int n,m,q;
void init()
{
for(int i=2,j=0;i<=m;i++)
{
while(j&&t[i]!=t[j+1]) j=ne[j];
if(t[i]==t[j+1]) j++;
ne[i]=j;
}
}
//t字符串和s的[l,r]部分进行kmp匹配
int kmp(int l,int r)
{
int res=0;
for(int i=l,j=0;i<=r;i++)
{
while(j&&s[i]!=t[j+1]) j=ne[j];
if(s[i]==t[j+1]) j++;
if(j==m)
{
res++;
j=ne[j];
}
}
return res;
}
int main()
{
scanf("%d%d%d",&n,&m,&q);//输入字符串s的长度,字符串t的长度,询问次数
scanf("%s",s+1);
scanf("%s",t+1);
init();
while(q--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",kmp(l,r));
}
return 0;
}
3.满二叉树等长路径
深度为n的满二叉树
每个边上都有权值
为了使得根节点到每个叶子结点的距离都相等
我们可以对边进行增加长度的操作
问最少增加多少长度,使得根节点到每个叶子结点的距离都相等
遍历到一个结点u,其左子树根节点为x(u<<1),右子树根节点为y(u<<1|1)
u到其左右子树根节点的距离分别是
d1=g[u][x]+x到根节点的距离
d2=g[u][y]+y到根节点的距离
所以让两者距离相等,需要加上abs(d1-d2)长度即可
更新完后,u到叶节点的路径长度hh[u]也要更新为max(x,y)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1025<<2;//2的11次方-1再多加一点即可
int ans;
int g[N][N];//点与点间边的权重
int hh[N];//u结点到叶子节点的路径长度
int n;
int sum;
void dfs(int u)
{
if(u>sum) return;
dfs(u<<1);
dfs(u<<1|1);
int d1=g[u][u<<1]+hh[u<<1];
int d2=g[u][u<<1|1]+hh[u<<1|1];
ans+=abs(d1-d2);
hh[u]=max(d1,d2);
}
int main()
{
cin>>n;
sum=(1<<(n+1))-1;
for(int i=2;i<=sum;i++)
{
int x;
cin>>x;
g[i>>1][i]=x;
g[i][i>>1]=x;
}
dfs(1);//dfs根节点
cout<<ans<<endl;
return 0;
}