目录
D - Can you solve this equation?
A - Drying
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
有一堆湿衣服和一台烘干机,每一件湿衣服上都有一个固定的湿度,每过一秒湿度就会减少1,当湿衣服放在烘干机上时,湿度每秒减少k,问最少需要几秒,能把所有湿衣服都烘干
做法:
二分答案,判断时注意向上取整,因为当湿度小于k时还是要消耗一秒来烘干的
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #include<cmath> #define Pi acos(-1.0) using namespace std; typedef long long ll; const ll maxn=1e5+10; ll n,a[maxn],k; int main() { ios::sync_with_stdio(false); while(scanf("%d",&n) != EOF) { ll maxx=0; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),maxx=max(maxx,a[i]); scanf("%lld",&k); if(k==1) { printf("%lld\n",maxx); continue; } ll l=1,r=maxx,mid,ans,sum=0; while(l<=r) { sum=0; mid=(l+r)/2; for(int i=1;i<=n;i++) { if(a[i]>mid) sum+=(ceil((a[i] - mid ) * 1.0 / (k - 1) )); } if(sum<=mid) ans=mid,r=mid-1; else l=mid+1; } printf("%lld\n",ans); } return 0; } /** */
B - Garland
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
一个类似于反抛物线的曲线,告诉你曲线的左边端点,并且这个曲线上的每一个点的高度都是相邻两个点的高度平均值-1,问当右端点最矮是多少时,最低点不会触碰到地面(也就是x轴)
做法:
一如既往的二分答案,区间精度的话似乎是小于1e-7即可
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #include<cmath> #define Pi acos(-1.0) using namespace std; typedef long long ll; const ll maxn=1e5+1000; int N; double A,num[1010],ans; bool judge(double x) { double tmp=A,sum=x; for(int i=3;i<=N;i++) { double temp=sum; sum=2*sum-tmp+2; tmp=temp; if(sum<1e-10) return false; } ans=sum; return true; } int main() { ios::sync_with_stdio(false); while(scanf("%d%lf",&N,&A)==2) { double l=0,r=maxn,mid; ans=0; while(r-l>1e-10) { mid=(l+r)/2.0; if(judge(mid)) r=mid; else l=mid; } printf("%.2f\n",ans); } return 0; } /** */
C - How Many Tables
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
你和一群你的好朋友办聚餐,你的每一个好朋友呢又有不同的圈子,不同的朋友圈不能交叉在一起,问最少需要几张桌子才能保证所有的朋友圈都是独立的
做法:
标标准准的并查集的板子题
自己手写的一个板子(仅供参考)
#include<bits/stdc++.h> #include<stack> using namespace std; typedef long long ll; const int maxn=1e3+10; int N,M; int f[maxn]; void init(int n) { for(int i=1; i<=n; i++) f[i]=i; } int Find(int x) { while(f[x]!=x) x=f[x]; return x; } void merge(int a,int b) { int x=Find(a); int y=Find(b); if(x!=y) f[x]=y; } int main() { int fa,so; while(cin>>N>>M&&N) { init(N); for(int i=1; i<=M; i++) { cin>>fa>>so; merge(fa,so); } int cnt=-1; for(int i=1; i<=N; i++) if(f[i]==i) cnt++; cout<<cnt<<endl; } return 0; }
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #define Pi acos(-1.0) using namespace std; typedef long long ll; const int maxn=1010; int T,n,m; int fa[maxn]; void init() { for(int i=1;i<=n;i++) fa[i]=i; } int Find(int x) { if(fa[x]==x) return x; return fa[x]=Find(fa[x]); } void Merge(int a,int b) { int x=Find(a); int y=Find(b); if(x!=y) fa[y]=x; } int main() { ios::sync_with_stdio(false); cin>>T; while(T--) { int ans=0; cin>>n>>m; init(); while(m--) { int a,b; cin>>a>>b; Merge(a,b); } for(int i=1;i<=n;i++) if(fa[i]==i) ans++; cout<<ans<<endl; } return 0; } /** */
D - Can you solve this equation?
题目链接:
https://vjudge.net/contest/453932#problem/D
题意:
给定一个方程式8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,给定Y的值,求X的值
做法:
咱们对于X进行一个答案二分,然后再带回式子中看是否成立,若是小于Y则提高下限,否则降低上限
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #define Pi acos(-1.0) using namespace std; typedef long long ll; const ll maxn=1e10; int T,Y; double judge(double x) { return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6; } double slove() { if(judge(0)>Y||judge(100)<Y) return 0; double l=0.0,r=100.0,mid; while(r-l>1e-10) { mid=(l+r)/2.0; if(judge(mid)>(double)Y) r=mid; else l=mid; } return mid; } int main() { ios::sync_with_stdio(false); cin>>T; while(T--) { cin>>Y; if(!slove()) cout<<"No solution!"<<endl; else cout<<fixed<<setprecision(4)<<slove()<<endl; } return 0; } /** */
E - CD
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
给定两个数组(已经是升序了),问两个数组中相同的元素有几个
做法:
首先可以暴力!数组开到一千万就能暴力跑过,其次二分查找是正解,绝对不会超时
多组输入哦,别被这个给搞了
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #define Pi acos(-1.0) using namespace std; typedef long long ll; const ll maxn=1e6+10; int n,m; int a[maxn],b; int erfen(int b) { int l=1,r=n,mid; while(l<=r) { mid=(l+r)/2; if(a[mid]==b) return 1; else { if(a[mid]>b) r=mid-1; else l=mid+1; } } return 0; } int main() { ios::sync_with_stdio(false); while(cin>>n>>m&&n&&m) { int num=0; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) { cin>>b; num+=erfen(b); } cout<<num<<endl; } return 0; } /** */
F - Monthly Expense
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
给定了n组数据,求这些数组中数据和中的最小值最大时是多少
做法:
最小值最大化啦,贪心的想,贪心的二分的干活
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #define Pi acos(-1.0) #define inf 1e9+7; using namespace std; typedef long long ll; const ll maxn=1e5+10; int N,M; int mon[maxn]; bool judge(int x) { int cnt=0,sum=0; for(int i=1;i<=N;i++) { if(sum+mon[i]<=x) sum+=mon[i]; else sum=mon[i],cnt++; } if(cnt<M) return false; return true; } int main() { ios::sync_with_stdio(false); while(cin>>N>>M) { memset(mon,0,sizeof(mon)); for(int i=1;i<=N;i++) cin>>mon[i]; int l=mon[1]; int r=0,mid; for(int i=1;i<=N;i++) { r+=mon[i]; l=max(l,mon[i]); } while(l<=r) { mid=(l+r)/2; if(judge(mid)) l=mid+1; else r=mid-1; } cout<<l<<endl; } return 0; } /** */
G - Aggressive cows
题目链接:
HRBU 2021年暑期训练阶段四Day2 - Virtual Judge
题意:
在一条数轴上有几个固定位置的牛棚,要把C头牛牛放到这些牛棚里,两头牛牛要是离得太近会干架,所以需要你尽可能的把这些牛牛分开来,问这些牛牛确定位置后最小距离的最大值是多少呢
做法:
好熟悉呀,最小值最大化,和上一题类似呀,但是输入的位置数据需要排序,因为不是升序的
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<string> #include<string.h> #include<cstdlib> #include<fstream> #include<queue> #include<stack> #include<map> #include<set> #include<iomanip> #include<iomanip> #define Pi acos(-1.0) #define inf 1e9+7; using namespace std; typedef long long ll; const ll maxn=1e5+10; int N,C; int X[maxn]; bool judge(int x) { int cnt=1,sum=0; for(int i=2;i<=N;i++) { if(sum+X[i]-X[i-1]<x) sum+=X[i]-X[i-1]; else sum=0,cnt++; } if(cnt<C) return false; return true; } int main() { ios::sync_with_stdio(false); while(cin>>N>>C) { for(int i=1;i<=N;i++) cin>>X[i]; sort(X+1,X+N+1); int l=X[N]-X[1]; int r=l,mid; for(int i=2;i<=N;i++) l=min(l,X[i]-X[i-1]); while(l<=r) { mid=(l+r)/2; if(judge(mid)) l=mid+1; else r=mid-1; } cout<<r<<endl; } return 0; } /** */