洛谷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; }
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; }
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; }
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; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于洛谷10月月赛R1·普及组的主要内容,如果未能解决你的问题,请参考以下文章