洛谷10月月赛R1·普及组

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷10月月赛R1·普及组相关的知识,希望对你有一定的参考价值。

SAC E#1 - 一道不可做题 Jelly

这题是大水题,随便AC。

就是要注意一点:初始温度与熔点的大小关系。

就是因为这个。。wa了。。

#include<iostream>
using namespace std;
long long a,b,c,d,e,f,tmp;
int main()
{
    cin>>a>>b>>c>>d>>e>>f;
    if(a<b){
        tmp=(b-a)*c;
        if(tmp>f)tmp=f;
        f-=tmp;
        a+=tmp/c;
    }
    if(a==b)f-=d;
    cout<<a+f/e;
    return 0;
}
View Code

SAC E#1 - 一道神题 Sequence1

这题也挺容易的,挺好想,虽然题目给出的条件看着有点复杂。

实际上就是要么a[1]大,a[2]小,a[3]大……要么a[1]小,a[2]大,a[3]小……

很容易地可以O(n)出解。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();}
    return num*t;
}
int a[100010],n;
bool check(bool t){
    bool ok=1;
    for(int i=2;i<=n;i++,t=!t)
        if(a[i]!=a[i-1]&&(a[i]>a[i-1])!=t)
            if(ok==0)return 0;
            else ok=0,i++,t=!t;
    return 1;
}
int main()
{
    while(scanf("%d",&n)==1){
        for(int i=1;i<=n;i++)a[i]=read();
        printf(check(0)|check(1)?"Yes\\n":"No\\n");
    }
    return 0;
}
View Code

SAC E#1 - 一道难题 Tree

也是水题啦。简单的DFS遍历一遍整棵树。

f[i]表示去掉i节点的子树里的叶子节点的代价。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();}
    return num*t;
}
const int N=100010;
struct edge{int t;long long c;};
vector<edge> g[N];
int n,s;long long f[N];
void solve(int x,int fa){
    if(fa!=-1&&g[x].size()==1){
        f[x]=1e16;return;
    }
    for(int i=0;i<g[x].size();i++){
        edge e=g[x][i];
        if(e.t!=fa){
            solve(e.t,x);
            f[x]+=min(e.c,f[e.t]);
        }
    }
}
int main()
{
    n=read();s=read();
    for(int i=1;i<n;i++){
        int x=read(),y=read(),z;scanf("%lld",&z);
        g[x].push_back((edge){y,z});
        g[y].push_back((edge){x,z});
    }
    solve(s,-1);printf("%lld\\n",f[s]);
    return 0;
}
View Code

SAC E#1 - 一道中档题 Factorial

这题也并不是很难,但是要比前3题多思考一些。差不多是普及T3或T4的难度。

这题,我是从十进制入手。

先是想到如果要有0出现,那一定要有一些数,乘积为10。

然后我就想到10的质因数有2、5。也就是说,只要有一个数含有2或5的质因数,就会出现10的倍数。

既然这样我们对于k进制,就可以O(sqrt(k))求出k的质因数。

然后,现在知道了k的质因数,又该怎么做?

枚举1——n,找质因数?

显然是不行的。

这时,突然想到,n以内,2的倍数就是n/2个,也就是说1——n中有n/2个有一个2这个质因数。

那么n以内,所含有的2的质因数的个数就是“n/2+n/4+n/8+……”直到n/2^x=0为止。

同理,3、5、7……的个数也可以求出。

这样,就很容易可以的出答案了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,k,a[50][2];
long long get(long long x,long long y){
    long long ans=0;
    while(x){
        x/=y;ans+=x;
    }
    return ans;
}
int main()
{
    while(scanf("%lld%lld",&n,&k)==2){
        int cnt=0;
        for(long long i=2;i*i<=k;i++){
            if(k%i==0){
                int t=0;
                while(k%i==0){k/=i;t++;}
                a[++cnt][0]=i;a[cnt][1]=t;
            }
        }
        if(k>1)a[++cnt][0]=k,a[cnt][1]=1;
        long long ans=1e13;
        for(int i=1;i<=cnt;i++)
            ans=min(ans,get(n,a[i][0])/a[i][1]);
        printf("%lld\\n",ans);
    }
    return 0;
}
View Code

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

以上是关于洛谷10月月赛R1·普及组的主要内容,如果未能解决你的问题,请参考以下文章

洛谷10月月赛R2·浴谷八连测R3 -Chtholly-T1

洛谷⑨月月赛Round2 官方比赛 OI

洛谷洛谷月赛4月月赛Round 1/2

洛谷10月月赛Round.3

洛谷11月月赛round.1

洛谷10月月赛Round.1| P3399 丝绸之路 [DP]