Codeforces 752E Santa Claus and Tangerines 二分+记忆化
2016-12-26 20:05
417 查看
点击打开链接
二分joy值 每次判定时 对于每个a[i]只要>=joy时,就拆分成a[i]/2,a[i]-a[i]/2, p[a[i]]记忆化保存每个a[i]能拆分出多少个joy即可. 时间复杂度为O(n(logn)^2) n<=1e6 ai<=1e7
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+20;
const ll inf=1e15;
ll n,k;
int a
,clo;
int p[N*10],vis[N*10];//a[i]<1e7 p[a[i]] a[i]能分成多少块x
int rd()
{
int x=0;
char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
int dfs(int m,int x)
{
if(vis[m]==clo)
return p[m];
vis[m]=clo;//第clo次记忆化 memset会TLE
if(m<x)
return p[m]=0;
//a[i] (even or odd)->(a[i]/2,a[i]-a[i]/2)
else
{
return p[m]=max(1,dfs(m/2,x)+dfs(m-m/2,x));
}
}
bool check(int x)
{
ll cnt=0;
clo++;
//判断每个人是否能分到x个
for(int i=1;i<=n;i++)
{
cnt+=dfs(a[i],x);
}
return cnt>=k;
}
int main()
{
n=rd();
k=rd();
ll s=0;
int r=0;
for(int i=1;i<=n;i++)
{
a[i]=rd();
s+=a[i];
r=max(a[i],r);
}
if(s<k)
{
puts("-1");//每人至少一个
return 0;
}
int l=1;
int ans=-1;
clo=-1e7;//
sort(a+1,a+1+n);//减小递归次数
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
return 0;
}
二分joy值 每次判定时 对于每个a[i]只要>=joy时,就拆分成a[i]/2,a[i]-a[i]/2, p[a[i]]记忆化保存每个a[i]能拆分出多少个joy即可. 时间复杂度为O(n(logn)^2) n<=1e6 ai<=1e7
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+20;
const ll inf=1e15;
ll n,k;
int a
,clo;
int p[N*10],vis[N*10];//a[i]<1e7 p[a[i]] a[i]能分成多少块x
int rd()
{
int x=0;
char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
int dfs(int m,int x)
{
if(vis[m]==clo)
return p[m];
vis[m]=clo;//第clo次记忆化 memset会TLE
if(m<x)
return p[m]=0;
//a[i] (even or odd)->(a[i]/2,a[i]-a[i]/2)
else
{
return p[m]=max(1,dfs(m/2,x)+dfs(m-m/2,x));
}
}
bool check(int x)
{
ll cnt=0;
clo++;
//判断每个人是否能分到x个
for(int i=1;i<=n;i++)
{
cnt+=dfs(a[i],x);
}
return cnt>=k;
}
int main()
{
n=rd();
k=rd();
ll s=0;
int r=0;
for(int i=1;i<=n;i++)
{
a[i]=rd();
s+=a[i];
r=max(a[i],r);
}
if(s<k)
{
puts("-1");//每人至少一个
return 0;
}
int l=1;
int ans=-1;
clo=-1e7;//
sort(a+1,a+1+n);//减小递归次数
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
return 0;
}
相关文章推荐
- [CF752E]Santa Claus and Tangerines(二分答案,dp)
- 【codeforces 752E】Santa Claus and Tangerines
- 【Codeforces Round #389】Codeforces 752E Santa Claus and Tangerines【解法二】
- 【Codeforces Round #389】Codeforces 752E Santa Claus and Tangerines【解法一】
- CodeForces 748E. Santa Claus and Tangerines(二分,递推)
- Codeforces Round #389 Technocup 2017 E. Santa Claus and Tangerines(二分+DP)
- codeforces 748E Santa Claus and Tangerines
- CodeForces - 748E Santa Claus and Tangerines(枚举)
- Codeforces 748E - Santa Claus and Tangerines
- Codeforces Round #389 (Div. 2):Santa Claus and Tangerines(二分+DP)
- CodeForces 748E. Santa Claus and Tangerines 题解(递推or二分)
- Codeforces 748 E Santa Claus and Tangerines
- Santa Claus and Tangerines
- Codeforces 748B-Santa Claus and Keyboard Check
- 【codeforces 752C】Santa Claus and Robot
- CodeForces - 748C Santa Claus and Robot(思维)
- Codeforces 752C Santa Claus and Robot 思维
- 【codeforces 752C】Santa Claus and Robot
- 【codeforces 752C】Santa Claus and Robot
- Codeforces Round #389 Div.2 E. Santa Claus and Tangerines