首页 > 其他分享 >20240731题解

20240731题解

时间:2024-07-31 15:21:44浏览次数:6  
标签:20240731 int 题解 void boss inline include

这么简单的题目没有AK(

计时器(timer)

题目:
每次可以加上\(2^n-1\),问多少次变成\(x\)
题解:
因为较大的数大于较小的数的两倍,直接贪心的选最大的即可。
复杂度\(\Theta(T\log n)\)
代码:

#include<cstdio>
#define int long long
const int N=105,A=1000000000000000000;
int T,x,f[N],cnt;
inline void prework(){for(int i=2;i<=A;i<<=1)f[++cnt]=i-1;}
inline int calc(int x){
    int res=0;
    for(int i=cnt;i;i--)res+=x/f[i],x%=f[i];
    return res-1;
}
signed main(){
    for(freopen("timer.in","r",stdin),freopen("timer.out","w",stdout),prework(),scanf("%lld",&T);T--;)scanf("%lld",&x),printf("%lld\n",calc(x));
    return fflush(stdout),fclose(stdin),fclose(stdout),0;
}

Boss战(boss)

题目:
有\(n\)个回合,01串\(s_i\),如果\(s_i=0\)则第\(n\)个回合boss获得\(1\)层再生,你每回合可以造成\(x\)伤害,也可以使用毒药,让boss获得\(1\)层中毒,在boss有\(\ge1\)层再生时,使boss减少一层再生。回合结束时,一层再生可以让boss血量\(+r\),一层中毒可以使boss血量\(-p\)。有\(k\)瓶毒药。在\(n\)个回合后,问boss减小的最大血量。
题解:
假设不使用毒药,算出\(boss\)减少的血量。
在第\(i\)回合使用毒药时造成伤害为\(f_i\)。
若\(s_i=0\),\(f_i=(n-i+1)*p\)
若\(s_i=1\),\(f_i=(n-i+1)*(r+p)\)
排序贪心的选出前\(k\)大的即可。
可以证明,每次选取\(s_i=0\)时,前面所有的\(s_i=1\)都会被选取,此时中毒层数为\(0\)。
复杂度\(\Theta(n\log n)\)
如果使用双指针,复杂度可以优化到\(\Theta(n)\)
代码:

#include<cstdio>
#include<algorithm>
#define int long long
const int N=1000005;
int n,x,r,p,k,f[N],ans;
char s[N];
inline int cmp(int x,int y){return x>y;}
signed main(){
    freopen("boss.in","r",stdin),freopen("boss.out","w",stdout),scanf("%lld%lld%lld%lld%lld%s",&n,&x,&r,&p,&k,s+1);
    for(int i=1;i<=n;i++){
        if(s[i]^'0')f[i]=(n-i+1)*(r+p),ans+=x-(n-i+1)*r;
        else f[i]=(n-i+1)*p,ans+=x;
    }
    std::sort(f+1,f+n+1,cmp);
    for(int i=1;i<=k;i++)ans+=f[i];
    return printf("%lld\n",ans),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

路径(path)

题目:
有一个无项图,\(n\)个点,\(m\)条边,找一条从\(1\)开始,到\(n\)结束的路径,需要满足条件:路径上\(u\to v\)需要满足\(a_u\le a_v\)。路径的权值定义为\(a_i\)去重后的个数,求最小权值。
题解:
将\(a_i\)相等的极大联通块缩点,后按权值大小连边,求\(1\to n\)的最长路径。
时间复杂度\(\Theta(n\alpha(n)+m)\)(并查集找\(a_i\)相等的极大联通块)
可以优化到\(\Theta(n+m)\)
代码:

#include<cstdio>
#include<queue>
const int N=200005,INF=0x3f3f3f3f;
int n,m,a[N],head[N],pedge,f[N],fa[N],size[N];
struct Pair{
    int fi,se;
}e[N];
struct Edge{
    int to,next;
}edge[N];
inline void ins(int u,int v){edge[++pedge]={v,head[u]},head[u]=pedge;}
inline void Max(int&x,int y){if(y>x)x=y;}
int find(int x){return x^fa[x]?fa[x]=find(fa[x]):x;}
inline void swap(int&x,int&y){x^=y^=x^=y;}
inline void merge(int x,int y){
    x=find(x),y=find(y);
    if(x==y)return;
    if(size[x]<size[y])swap(x,y);
    size[x]+=size[y],fa[y]=x;
}
int dp(int u){
    if(f[u]!=-INF)return f[u];
    for(int e=head[u];e;e=edge[e].next){
        int v=edge[e].to;
        Max(f[u],dp(v)+1);
    }
    return f[u];
}
int main(){
    freopen("path.in","r",stdin),freopen("path.out","w",stdout),scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",a+i),fa[i]=i,size[i]=1,f[i]=-INF;
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v),e[i]={u,v};
        if(a[u]==a[v])merge(u,v);
    }
    for(int i=1;i<=m;i++){
        int u=find(e[i].fi),v=find(e[i].se);
        if(u^v)a[u]<a[v]?ins(v,u):ins(u,v);
    }
    f[find(1)]=1;
    int ans=dp(find(n));
    return printf("%d\n",ans<0?0:ans),fflush(stdout),fclose(stdin),fclose(stdout),0;
}

标签:20240731,int,题解,void,boss,inline,include
From: https://www.cnblogs.com/junjunccc/p/18334709

相关文章

  • P4784 城市 题解 / 最小斯坦纳树
    P4784城市题解题目大意给定\(n\)个节点,\(m\)条带边权边,和\(k\)重要节点。选择一些边,使得这些边能让这\(k\)个节点连通,代价为选出的边权和。求最小代价。(\(k\leq5\))Solve前置芝士:斯坦纳树。定义将指定点集合(部分点)中的所有点连通,且边权总和最小的生成树称为最小斯坦......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • ARC180 部分简要题解
    C设\(f_{i,j}\)为考虑前\(i\)个数,当前选出来的子序列和为\(j\)且强制最后一个选出来的数不为\(j\)的方案;设\(g_{i,j}\)为考虑前\(i\)个数,当前选出来的子序列和为\(j\)且强制最后一个选出来的数必为\(j\)的方案。注意到一个合法方案可以唯一与一个最后一个选出......
  • P10814 【模板】离线二维数点 题解
    题目传送门思路一眼主席树板子题,但是一看数据范围\(n,m\le2\times10^6\),似了。在线做法应该是似完了,考虑离线做法。我们知道树状数组是可以做二维偏序的,大家应该都知道一个经典问题:对于一个序列,多次询问下标\(\lea\)且数值\(\leb\)的数的个数。回到这道题,相比上面......
  • P2163 [SHOI2007] 园丁的烦恼 题解
    题目传送门题目大意:在一个平面直角坐标系上,给定\(n\)个点的坐标\((x,y)\),\(m\)次询问,每次询问一个矩形范围内的点的数量,此矩形用\(\{a,b,c,d\}\)来描述,其中\((a,b)\)为左下角,\((c,d)\)为右上角。思路:不难将题目转化为:给定一个长度为\(n\)的序列,序列中的每个元......
  • CF1997(edu168)题解 A-F
    A.StrongPassword注意到最大效果是在两个相同字符之间插入一个不同的,贡献为3。否则在一开始插入一个和首位不同的,贡献为2。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;voidsolve(){strings;cin>>s;boolok=0;for(inti......
  • 【题解】2024牛客多校第5场
    E安https://ac.nowcoder.com/acm/contest/81600/E分析简单博弈/思维题。当ai>bi时,当前骑士一定存活。当ai<bi时,当前骑士一定死亡。为了使得自己存活的骑士尽可能多,若存在ai=bi的情况,一定会选择令该骑士去攻击对方,并且双方均会轮流优先选择此类骑士。......
  • 07-30 题解
    07-30题解A朴素的想法$dp(i,j,k)$表示考虑到第\(i\)位,前\(i\)位的和为\(j\),第\(i\)位的值为\(k\)然后咋转移?重新定义移动小球的方式:从自己右边的邻居拿过来正数个球拿过来负数个球(即往右边的邻居放正数个球)在第2种操作中,我们拿走的球会被后面放过来......
  • Luogu P1983 车站分级 题解 [ 绿 ] [ 拓扑排序 ] [ 图论建模 ] [ 虚点 ]
    车站分级:很好的拓扑排序题,细节有点多。图论建模首先观察对于一条线路,我们可以从中直接得到什么信息:假设这条线路的开头为\(st\),结尾为\(ed\),那么在\([st,ed]\)的车站中,没有被选入线路的点一定比选入线路的点的级数至少少\(1\)。对于这一点条件,我们就可以建模了。......
  • CF538H Summer Dichotomy 题解
    Description有\(T\)名学生,你要从中选出至少\(t\)人,并将选出的人分成两组,可以有某一组是空的。有\(n\)名老师,每名老师要被分配到两个小组之一,对于第\(i\)名老师,要求所在的小组中的学生人数\(\in[l_i,r_i]\)。此外,有\(m\)对老师不能在同一个小组中。你需要判断能否......