【CF】222 Div.1 B Preparing for the Contest
2015-07-20 15:30
555 查看
这样类似的题目不少,很多都是一堆优化条件求最优解,这个题的策略就是二分+贪心。
对时间二分, 对费用采用贪心。
对时间二分, 对费用采用贪心。
/* 377B */ #include <iostream> #include <string> #include <map> #include <queue> #include <set> #include <stack> #include <vector> #include <deque> #include <algorithm> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <climits> #include <cctype> #include <cassert> #include <functional> #include <iterator> #include <iomanip> using namespace std; //#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int> #define stpii set<pair<int, int> > #define mpii map<int,int> #define vi vector<int> #define pii pair<int,int> #define vpii vector<pair<int,int> > #define rep(i, a, n) for (int i=a;i<n;++i) #define per(i, a, n) for (int i=n-1;i>=a;--i) #define clr clear #define pb push_back #define mp make_pair #define fir first #define sec second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 typedef struct node_t { int x, id; node_t() {} node_t(int x_, int id_): x(x_), id(id_) {} friend bool operator< (const node_t& a, const node_t& b) { return a.x > b.x; } } node_t; typedef struct student { int x, p, id; student() {} student(int x_, int p_, int id_): x(x_), p(p_), id(id_) {} friend bool operator< (const student& a, const student& b) { return a.x > b.x; } } student; const int maxn = 1e5+5; int a[maxn]; int n, m, s; node_t N[maxn]; student S[maxn]; bool comp(const student& a , const student& b) { return a.x > b.x; } bool judge(int t) { priority_queue<int,vi, greater<int> > Q; int i, j, k; int p; int tot = s; i = 0; // i for student j = 0; // j for Q while (j < m) { while (i<n && S[i].x>=N[j].x) { Q.push(S[i].p); ++i; } if (Q.empty()) break; p = Q.top(); Q.pop(); if (p > tot) return false; tot -= p; j += t; } return j>=m; } void bfs(int t) { priority_queue<pii,vpii, greater<pii> > Q; int i, j, k, id; int m_; i = 0; // i for student j = 0; // j for Q while (j < m) { while (i<n && S[i].x>=N[j].x) { Q.push(mp(S[i].p, S[i].id)); ++i; } id = Q.top().sec; Q.pop(); m_ = min(m, j+t); for (k=j; k<m_; ++k) a[N[k].id] = id; j += t; } } int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif int ans = -1; scanf("%d %d %d", &n, &m, &s); rep(i, 0, m) { scanf("%d", &N[i].x); N[i].id = i; } rep(i, 0, n) { scanf("%d", &S[i].x); S[i].id = i+1; } rep(i, 0, n) scanf("%d", &S[i].p); sort(N, N+m); sort(S, S+n); if (S[0].x < N[0].x) { puts("NO"); return 0; } int l = 1; int r = m+1; int mid; while (l <= r) { mid = (l+r)>>1; if (judge(mid)) { ans = mid; r = mid - 1; } else { l = mid + 1; } } if (ans > 0) { puts("YES"); bfs(ans); rep(i, 0, m) printf("%d ", a[i]); putchar('\n'); } else { puts("NO"); } #ifndef ONLINE_JUDGE printf("time = %d.\n", (int)clock()); #endif return 0; }
相关文章推荐
- [转]关于GET和POST的区别
- Java学习从入门到精通Java Learning Path
- ACM_Floyd-Warshall (Floyd) 算法
- redis-cluster研究和使用
- C#简单总结
- Android Service 服务(二)—— BroadcastReceiver
- Android中播放本地SD卡中歌曲需要的添加的权限
- android的布局属性详解
- NYOJ737
- 如何缩短SQL Server 的启动时间
- xe8 单元别名
- POJ 3258 River Hopscotch
- ListView去掉或者修改默认点击背景
- Android基础_页面布局_LinearLayout(线性布局)
- GRE写作必备句型
- spring基础——反射
- the difficult issue in face recognize
- 我的COCOS2D-X 3.0适配方案
- MS SQLServer 2008数据库处于SUSPECT情况下的处理
- vijos-1382 寻找主人