1. 程式人生 > >洛谷10月月賽R1·普及組

洛谷10月月賽R1·普及組

ack com iostream read n) none 水題 cin 初始

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·普及組