2015 Asia - Jakarta D - An ICPC Problem without Statement
来源:互联网 发布:ubuntu u盘系统 编辑:程序博客网 时间:2024/04/30 20:15
题目描述:
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=104601#problem/D
题解:
1.当一定大于等于0的时候,就是我们尽量凑2的时候,我们放2,-2,1, -1, 0的顺序,每次能放就放最多的,和-1的 dfs深搜.
2.当必须是-的时候,要么全部必须要选,要么全是负数(可以推一下) 所以就是绝对值小的.
重点:
1.负数的时候单拉出来绝对值最小.
2.减一的小方法
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int maxn = 1e5 + 100;int n, A, B;int a[maxn];int ans[maxn], val, tag;int b[20], number[10], have[20];int num;int change(int x) { if(x == 2) return 0; if(x == -2) return 1; if(x == 1) return 2; if(x == -1) return 3; return 4;}void dfs(int pos, int now) { if(pos == 4) { if(now + have[number[pos]] < num) return; int t = num - now; if(t == 0) { int tval = b[0] + b[1]; int ttag = (b[1] + b[3]) % 2; if(ttag == 1) ttag = -1; else ttag = 1; if(ttag > tag || (ttag == tag && (tag == 1 && tval > val || tag == -1 && tval < val))) { tag = ttag; val = tval; for(int i = 0; i <= 3; i++) { ans[i] = b[i]; } ans[4] = num - now; } } else { if(tag < 0) { tag = 0; val = 0; for(int i = 0; i <= 3; i++) { ans[i] = b[i]; } ans[4] = num - now; } } return; } int tmp = min(num - now, have[number[pos]]); b[pos] = tmp; dfs(pos + 1, now + tmp); if(tmp > 0) { b[pos] = tmp - 1; dfs(pos + 1, now + tmp - 1); }}vector<int> res;void solve() { tag = -2; for(num = A; num <= B; num++) dfs(0, 0); /*printf("%d %d\n", tag, val); for(int i = 0; i <= 4; i++) { printf("%d ", ans[i]); }*/ res.clear(); if(tag >= 0) { ; } else { if(A == n && A == B) { for(int i = 0; i <= 4; i++) ans[i] = have[i]; } else { for(int i = 0; i <= 4; i++) ans[i] = 0; ans[3] = min(A, have[3]); ans[1] = A - ans[3]; } } for(int i = 0; i < n; i++) { if(ans[change(a[i])] > 0) { res.push_back(i); ans[change(a[i])]--; } } printf("%d\n", res.size()); for(int i = 0; i < res.size(); i++) { printf("%d%c", res[i] + 1, (i == res.size() - 1 ? '\n' : ' ')); }}int main() { //freopen("d.txt", "r" ,stdin); number[0] = 0; number[1] = 1; number[2] = 2; number[3] = 3; number[4] = 4; int ncase; scanf("%d", &ncase); for(int _ = 1; _ <= ncase; _++) { printf("Case #%d:\n", _); scanf("%d %d %d", &n, &A, &B); for(int i = 0; i <= 4; i++) have[i] = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); have[change(a[i])]++; } solve(); } return 0;}
0 0
- 2015 Asia - Jakarta D - An ICPC Problem without Statement
- 2015 ACM/ICPC Asia Regional Shanghai Online An easy problem(简单题)
- HDU 5475.An easy problem【思路】【2015 ACM/ICPC Asia Regional Shanghai Online】【9月26】
- HDU 5475 2015 ACM/ICPC Asia Regional Shanghai Online An easy problem(线段树)
- 杭电5475/2015 ACM/ICPC Asia Regional Shanghai Online An easy problem(线段树过)
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest C – The Problem Needs 3D Arrays(最大密度子图)
- hdu 5008(2014 ACM/ICPC Asia Regional Xi'an Online ) Boring String Problem(后缀数组&二分)
- Problem D. Ice Cream Tower (The 2016 ACM-ICPC Asia China-Final Contest)(二分)
- 回文自动机 + DFS --- The 2014 ACM-ICPC Asia Xi’an Regional Contest Problem G.The Problem to Slow Down You
- HDU 5475 An easy problem(用大数模板,你就上当了)——2015 ACM/ICPC Asia Regional Shanghai Online
- HDU 5475 An easy problem 2015ICPC 上海网络赛
- hdu 5443 The Water Problem 水题 2015 ACM/ICPC Asia Regional Changchun Online
- 2015 ACM/ICPC Asia Regional Changchun Online-1007The Water Problem(线段树裸题)
- hdu 5443 The Water Problem 2015 ACM/ICPC Asia Regional Changchun Online
- HDU 5443The Water Problem 2015 ACM/ICPC Asia Regional Changchun Online
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest(H - The Problem to Make You Happy )
- The 2015 ACM-ICPC Asia Beijing Regional Contest K A Math Problem
- 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest D題:Space Golf [二分+三分+基础数学]
- UISearchController VS UISearchBar and UISearchDisplayController
- FAT32与NTFS区别
- HDU-1443 Joseph
- 3.Git远程仓库添加及克隆
- 模板的实例化和具体化
- 2015 Asia - Jakarta D - An ICPC Problem without Statement
- 1025. PAT Ranking (25)
- 知乎答案怎样学caffe
- 常见的电平标准
- 思考:系统的瓶颈到底在哪儿,redis的作用?
- JAVA enum(枚举)使用详解 + 总结
- 简单的贪心。注意用结构体排序!!
- 升级centos的Python至3.5.1
- 手机显示电量原理