Arthur and Table CodeForces - 557C
2024-08-28 00:20:24
Arthur and Table CodeForces - 557C
首先,按长度排序。
长度为p的桌腿有a[p]个。
要使得长度为p的桌腿为最长,那么要按照代价从小到大砍掉sum{长度不到p的腿的数量}-a[p]+1条腿。还需要将所有长于p的桌腿砍光。枚举p即可。
要点(看了题解才明白):可以通过精力最高只有200的条件,大大缩小时间/空间复杂度。
恩,所以...这是贪心吧?
#include<cstdio>
#include<algorithm>
using namespace std;
struct Leg
{
int len,cost,len2;
bool operator<(const Leg& b) const
{
return len<b.len||(len==b.len&&cost<b.cost);
}
}l[];
int l2[];
int sum1,n,ans=0x3f3f3f3f,now,now2,now3,sum2;
int main()
{
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&l[i].len);
for(i=;i<=n;i++)
scanf("%d",&l[i].cost);
sort(l+,l+n+);
for(i=;i<=n;i++)
if(l[i].len!=l[i-].len)
l[i].len2=l[i-].len2+;
else
l[i].len2=l[i-].len2;
for(i=;i<=n;i++)
sum2+=l[i].cost;
for(i=;i<=n;i++)
{
sum2-=l[i].cost;
now++;
if(l[i].len2==l[i+].len2) continue;
now2=sum1-now+;
if(now2<=)
{
ans=min(sum2,ans);
}
else
{
now3=;
for(j=;j<=;j++)
{
if(l2[j]>=now2)
{
now3+=j*now2;
break;
}
now2-=l2[j];
now3+=j*l2[j];
}
ans=min(now3+sum2,ans);
}
for(j=i;l[j].len2==l[j-].len2;j--)
l2[l[j].cost]++;
l2[l[j].cost]++;
sum1+=now;
now=;
}
printf("%d",ans);
return ;
}
最新文章
- VS-项目发布失败的解决方案1
- 将ASP.NET Core应用程序部署至生产环境中(CentOS7)
- [Django] Setting up Django Development Environment in Ubuntu 14.04
- 每天一命令 git stash
- Class和ClassLoader的getResourceAsStream区别
- Delphi中uses在interfeace和implementation中的区别
- 八款你不得不知的开源前端JS框架
- hadoop集群默认配置和常用配置【转】
- 正则表达式 之 C#后台应用
- 类型<;T>; where T:class的用法
- 节点的创建--对比jQuery与JavaScript 方法
- js window.open 参数设置
- 周赛D题
- ui主线程控件的更新就让这个activity的异步任务做完整
- JDBC中rs.beforeFirst()
- SpringMVC框架学习笔记(3)——controller配置汇总
- HTML5的优点与缺点?
- idea Invalid bound statement (not found):
- Linux mail 邮件发送
- GNum试用体验