暴力枚举 C. Arthur and Table
2015-07-13 20:28
357 查看
链接:http://codeforces.com/problemset/problem/557/C
直接暴力枚举即可
注意d的范围为1-200
这样维护就比较简单了
代码:
直接暴力枚举即可
注意d的范围为1-200
这样维护就比较简单了
代码:
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> using namespace std; #define For(i,n) for(int i=0;i<n;i++) #define MAX 100005 int ans[201]; int b[MAX]; int f[MAX]; struct node{ int l; int v; int cnt; }mp[MAX]; bool cmp(node x,node y){ return x.l < y.l; } int main(void){ int sum = 1e8; int n;cin >> n; For(i,n) cin >> mp[i].l; For(i,n) cin >> mp[i].v; sort(mp,mp+n,cmp); for(int i =0;i<n;i++){ int cnt=1,t = i; while(mp[i].l == mp[i+1].l)cnt++,i++; mp[t].cnt = cnt; } f[0]=mp[0].v; For(i,n)if(i>=1)f[i]=f[i-1]+mp[i].v; for(int i = n-1;i>=0;i--)b[i]=b[i+1]+mp[i].v; for(int i = 0;i < n;){ int cnt = mp[i].cnt -1 ; int s = b[i+mp[i].cnt]; int t = 0; for(int j=200; j>=1;j--){ if(ans[j] && cnt){ if(ans[j]>=cnt){t+=j*cnt;break;} else t+= j*ans[j], cnt -= ans[j]; } } s += f[i-1]-t; sum = min(sum,s); for(int j = i;j < i + mp[i].cnt;j++)ans[mp[j].v]++; i+=mp[i].cnt; } cout << sum <<endl; }
相关文章推荐
- hdu4185最大二分匹配
- C++常用术语及其英文翻译的含义和简单用途总结(一)
- 编译器实践一 之 加法栈式计算机
- 20150713,关于C。
- 文件压缩和解压
- ABAP 屏幕属性列表
- 大数据中位数算法
- 数组与指针的区别
- java io流管道流
- hdu 1865 1sting
- String转成字符串数组
- 使用多target来构建大量相似App
- override与重载(overload)的区别
- 深入理解Linux内核-进程
- 游标,又是游标啊,快点让我崩溃到哭了
- awk使用详解
- http://objccn.io/
- 1153_Ray数
- HDU-1076-An Easy Task(Debian下水题测试.....)
- Java集合系列之HashSet源码分析