Codeforces Round #311
2015-07-01 18:51
288 查看
昨天晚上的Codeforces 写的有点逗,无状态呀~
暴力
判断是否总量小于w,并且杯子容量够用,当然排序后,只需要判断w[0]是否满足女生,w
是否满足男生就可以了。
我的写法要控制二分的次数,否则会T掉
答案肯定是某种长度的腿全部留下,个数为len个,还可以保留len-1个长度比选择的腿短的,贪心选择花费最大的就好了。题中给出的花费<=200,所以暴力200进行选择就好了。
A题:
题意:满足三个条件的等级数量分配,尽量让一级的最多,二等其次,输出答案 。暴力
const int maxn=1000+5; using namespace std; int main() { int n; while(cin>>n) { int a,b,c; int aa,bb,cc; cin>>a>>aa>>b>>bb>>c>>cc; for(int i=aa;i>=a;i--) { int yu=n-i; if(yu<(b+c))continue; for(int j=bb;j>=b;j--) { int d=yu-j; if(d>=c&&d<=cc) { cout<<i<<" "<<j<<" "<<d<<endl; return 0; } } } } return 0; }
B题:
题意:给n个男生和给n个女生倒水,给你2*N个杯子的容量,倒水的总量不超过W,求最多倒水。
解法:二分判断判断是否总量小于w,并且杯子容量够用,当然排序后,只需要判断w[0]是否满足女生,w
是否满足男生就可以了。
我的写法要控制二分的次数,否则会T掉
const int maxn=200000+5; using namespace std; const double eps=1e-12; double a[maxn]; int n; double w; int getbool(double x) { if(3*n*x>w)return false; if(a[0]<x)return false; if(a <2*x)return false; return true; } int main() { while(cin>>n>>w) { for(int i=0;i<2*n;i++) { scanf("%lf",&a[i]); } sort(a,a+2*n); double ans=0; int num=0; double l=0;double r=w*3.0; while(r-l>=eps) { num++;if(num>10000000)break; double mid=(r+l)/2.0; if(getbool(mid)) { l=mid; ans=mid; } else r=mid; } ans=ans*3.0*(double)n; printf("%.8lf\n",ans); } return 0; }
C题:
题意:砍掉一些桌子腿,是桌子稳固,稳固的条件,1:最长的腿数量最多 2:最长的腿数量占一半以上
解法:贪心答案肯定是某种长度的腿全部留下,个数为len个,还可以保留len-1个长度比选择的腿短的,贪心选择花费最大的就好了。题中给出的花费<=200,所以暴力200进行选择就好了。
#define ll long long const int maxn=100000+5; using namespace std; int n; struct node { int l,d; }a[maxn]; int b; bool cmp(node a,node b) { return a.l<b.l; } int main() { while(cin>>n) { b=0; for(int i=0;i<n;i++) { scanf("%d",&a[i].l); } for(int i=0;i<n;i++) { scanf("%d",&a[i].d); b+=a[i].d; } sort(a,a+n,cmp); int ans=0x5fffffff; int num[250]; memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { int len=0; int sum=0; for(;i<n;i++) { sum+=a[i].d;len++; if((i+1)<n){ if(a[i].l!=a[i+1].l)break; } else break; } int t=len-1; for(int j=200;j>=1;j--) { if(t<=num[j]){ sum+=(t*j); break; } else{ t-=num[j]; sum+=(num[j]*j); } } for(int j=0;j<len;j++) { num[a[i-j].d]++; } ans=min(ans,b-sum); } cout<<ans<<endl; } return 0; }
相关文章推荐
- 触摸模式(Touch Mode)
- <重构:改善即有代码的设计>读书分享
- C#学习笔记(三):值类型、引用类型及参数传递
- tolua++入门
- spring mvc 上传文件 常见问题及解决办法
- python3.4学习笔记(十) 常用操作符,条件分支和循环实例
- Node.js爬虫抓取数据 -- HTML 实体编码处理办法
- 通过 ulimit 改善系统性能
- 如何使用Eclipse来打包unity3d工程
- Android 中 EventBus 的使用
- 【Linux 内核网络协议栈源码剖析】listen 函数剖析
- SEAndroid初步了解
- 当元素获得焦点和失去焦点时,触发 的事件。
- JDK免安装版,解压后需要配置环境变量
- Django开发(五)——显示图片,加载css,js等静态文件
- JSON详解
- haayaGuardV0---3---手机与pc基于p2p通信
- mesos资料收集
- OJ第三批——Problem N: 熟悉题型——填空题(删除线性表节点)
- c++面试题