牛客每日一题
今天突然发现牛客上的每日一题也很宝藏~!!!决定刷一下~~~持续更新
链接:https://ac.nowcoder.com/acm/problem/13221
来源:牛客网
数码(数论分块)
题目描述
#include<iostream> #include<algorithm> using namespace std; long long l,r; long long calculate(long long x,long long k) { long long h=0,ans=x/k; long long be=k*10,end=min(x,k*10+9); for(;be<=x;be*=10,end=end*10+9) { h=min(x,end); for(int i=be;i<=h;) { long long tag=x/i; long long lim=min(x/tag,h); ans+=tag*(lim-i+1); i=lim+1; } } return ans; } int main() { cin>>l>>r; for(int i=1;i<=9;i++) { cout<<calculate(r,i)-calculate(l-1,i)<<endl; } return 0; }
来源:牛客网
题目描述
#include<iostream> #include<algorithm> using namespace std; #define maxn 110000 #define ll long long long long n,cnt,head[maxn],dep[maxn],ans,ans1; struct edge{ long long nx,to; }edge[maxn*2]; void add(int u,int v) { edge[++cnt].nx=head[u]; edge[cnt].to=v; head[u]=cnt; } void dfs(ll u,ll fa,ll depth) { if(depth%2==0) ans++; else ans1++; for(int i=head[u];i;i=edge[i].nx) { ll v=edge[i].to; if(v!=fa) { dfs(v,u,depth+1); } } } int main() { cin>>n; for(int i=1;i<n;++i) { ll x,y; cin>>x>>y; add(x,y),add(y,x); } dfs(1,0,0); cout<<ans*(ans-1)/2+ans1*(ans1-1)/2; }
来源:牛客网
题目描述
设第i位和第j位分别位ai和aj(i<j),则ai=1,aj=0。
答案对1e9+7取模。
#include<iostream> #include<bits/stdc++.h> using namespace std; #define ll long long const ll mod=1e9+7; ll pow1(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } int main() { ll n; cin>>n; if(n==1) cout<<0; else { ll ans1=pow1(2,n-2); ll k=((n%mod)*((n-1)%mod)/2); cout<<(ans1%mod)*(k%mod)%mod; } return 0; }
链接:https://ac.nowcoder.com/acm/problem/23049
来源:牛客网
题目描述
华华不知道裁剪成多长比较好,所以干脆越长越好。不过由于华华有点强迫症,所以他希望长度为非负整数。保证所有木棍的原长也是非负整数。那么请问华华最终得到的每根木棍多长呢?
#include<iostream> #include<algorithm> using namespace std; #define ll long long #define maxn 110000 ll n,k,max1=0; ll L[maxn]; bool check(ll mid) { ll ans=0; for(int i=1;i<=n;++i) { if(L[i]<mid) continue; ans+=L[i]/mid; } if(ans<k) return 0; else return 1; } int main() { cin>>n>>k; for(ll i=1;i<=n;++i) cin>>L[i],max1=max(max1,L[i]); ll l=1,r=max1,h=0; while(l<r) { ll mid=(l+r)/2+1; if(check(mid)) h=mid,l=mid+1; else r=mid-1; } if(check(h+1)) cout<<h+1; else cout<<h; return 0; }
链接:https://ac.nowcoder.com/acm/problem/20273
来源:牛客网
题目描述
来源:牛客网
题目描述
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
#include<bits/stdc++.h> #include<algorithm> using namespace std; #define ll long long const ll maxn=2000000; int l,s,t,h,f[maxn],m,discre[maxn],stone[maxn]; int dp[maxn]; int main() { cin>>l>>s>>t>>m; for(int i=1;i<=m;i++) cin>>stone[i]; sort(stone+1,stone+1+m); for(int i=1;i<=m;i++) { if(stone[i]-stone[i-1]>s*t) h+=(stone[i]-stone[i-1])%t+t*s;//离散化 else h+=stone[i]-stone[i-1]; discre[h]=1; } memset(dp,0x3f,sizeof(dp)); dp[0]=0; for(int i=1;i<=h+t;i++) { for(int j=s;j<=t;j++) if(i>=j) dp[i]=min(dp[i],dp[i-j]+discre[i]); } int ans=0x3f; for(int i=h;i<=h+t;i++) ans=min(ans,dp[i]); cout<<ans; }