洛谷10月月賽R1·普及組
阿新 • • 發佈:2017-10-12
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; aView Code+=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> usingView Codenamespace 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; }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·普及組