A
在只能横着切披萨和竖着切的时候,必须保证均匀的切割才能保证所有披萨面积一致,若横着切不均匀,那么在考虑某一列的披萨,则它们的宽不一致,则不能满足题意。
依照此想法枚举横着切的次数即可。复杂度O(k)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
double noww,squ;
signed main()
{
cin>>n>>k;
noww=n;
for(int i=0;i<=k;++i)
{
double x1=n*1.0/(i+1);
double x2=n*1.0/(k-i+1);
if(abs(x1-x2)<=noww)
{squ=x1*x2;
noww=abs(x1-x2);
}
}
printf("%.2lf",squ);
}
B
模拟,但不能在区间内每个应当插入相同字母逐次模拟,这样复杂度为O(n*n),超时,利用q小的特点,应当对区间后所有字母统一向后移动两倍区间长,后修改字母,这样复杂度只有O(q*n)。
#include<bits/stdc++.h>
using namespace std;
#define maxx 322000
int n,neww,q,a,b;
char s[maxx];
char p[maxx];
void insertt(int i,int sz)
{
for(int j=n;j>=i+sz;--j)
s[j+sz]=s[j];
for(int j=i;j<i+2*sz;++j)
s[j]=p[j-i+1];
n=n+sz;
}
signed main()
{
cin>>n>>q;
for(int i=1;i<=n;++i)
cin>>s[i];
for(int i=1;i<=q;++i)
{
cin>>a>>b;
neww=0;
for(int i=a;i<=b;++i)
{p[++neww]=s[i];
p[++neww]=s[i];
}
insertt(a,b-a+1);
}
for(int i=1;i<=n;++i)
cout<<s[i];
}
C
贪心,将数字排序后,由于最大最小值才影响答案,我们优先将最大最小值进行合并后求出平均值,枚举最大最小值个数,注意同时计算和,或处理前缀和,避免平方复杂度。复杂度O(n)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxx 322000
int n,k,q,a,b;
int all[maxx];
double pj,ans;
int nl,nr;
signed main()
{
cin>>n>>k;
for(int i=1;i<=n;++i)
cin>>all[i];
sort(all+1,all+1+n);
for(int i=n;i>n-k;--i)
nr=nr+all[i];
if(k==n)
{
cout<<0;
return 0;
}
ans=max(nr*1.0/k,all[n-k]*1.0)-min(nr*1.0/k,all[1]*1.0);
for(int i=1;i<=k;++i)
{
nr=nr-all[n-k+i];
nl=nl+all[i];
double q=(nr+nl)*1.0/k;
ans=min(ans,max(q,all[n-k+i]*1.0)-min(q,all[i+1]*1.0));
}
printf("%lf",ans);
}
D
二分,答案具有单调性,随着n的增加,1-n的最短路逐渐减少,当n过大时无法到达。
二分车重,随后给定车重下进行最短路,复杂度O(nlognlogw),最短路可以使用堆优化的迪杰斯特拉算法实现。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxx 222210
#define INF 0x3f3f3f3f
int l,r;
int n,m,h,a,b,c,t;
struct mre //[i,j]
{
int st,ed,val,lim;
};
struct mre E[maxx];
map<int,vector<int>> M;
vector<int> G[maxx];
int d[maxx];
void dij(int q)
{
M[0].push_back(1);
for(int i=1;i<=n;++i) d[i]=INF;
while(!M.empty())
{
int a=M.begin()->first;
int b=M.begin()->second[M.begin()->second.size()-1];
M.begin()->second.pop_back();
if(M.begin()->second.size()==0) M.erase(M.begin());
if(d[b]!=INF) continue;
d[b]=a;
for(int i=0;i<G[b].size();++i)
{if(E[G[b][i]].lim<q) continue;
M[a+E[G[b][i]].val].push_back(E[G[b][i]].ed);}
}
}
int check(int mid)
{
dij(mid);
if(d[n]<=h) return 1;
else return 0;
}
signed main()
{
cin>>n>>m>>h;
for(int i=1;i<=m;++i)
{cin>>a>>b>>c>>t;
E[++neww].st=a;
E[neww].ed=b;
E[neww].lim=c;
E[neww].val=t;
G[a].push_back(neww);
E[++neww].st=b;
E[neww].ed=a;
E[neww].lim=c;
E[neww].val=t;
G[b].push_back(neww);
r=max(c,r);
}
l=0;
//check(6);
dij(0);
if(d[n]==INF)
{
cout<<-1;
return 0;
}
r=r+1;
while(l<r)
{
int mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid;
}
cout<<l-1;
}



京公网安备 11010502036488号