CF - 高精度 + 贪心
Last year Bob earned by selling memory sticks. During each of n days of his work one of the two following events took place:
- A customer came to Bob and asked to sell him a 2x MB memory stick. If Bob had such a stick, he sold it and got 2x berllars.
- Bob won some programming competition and got a 2x MB memory stick as a prize. Bob could choose whether to present this memory stick to one of his friends, or keep it.
Bob never kept more than one memory stick, as he feared to mix up their capacities, and deceive a customer unintentionally. It is also known that for each memory stick capacity there was at most one customer, who wanted to buy that memory stick. Now, knowing all the customers' demands and all the prizes won at programming competitions during the last n days, Bob wants to know, how much money he could have earned, if he had acted optimally.
Input
The first input line contains number n (1 ≤ n ≤ 5000) — amount of Bob's working days. The following n lines contain the description of the days. Line sell x stands for a day when a customer came to Bob to buy a 2x MB memory stick (0 ≤ x ≤ 2000). It's guaranteed that for each x there is not more than one line sell x. Line win x stands for a day when Bob won a 2x MB memory stick (0 ≤ x ≤ 2000).
Output
Output the maximum possible earnings for Bob in berllars, that he would have had if he had known all the events beforehand. Don't forget, please, that Bob can't keep more than one memory stick at a time.
Example
7
win 10
win 5
win 3
sell 5
sell 3
win 10
sell 10
1056
3
win 5
sell 6
sell 4
0 题目分析 : 一个人卖内存条,sell 表示有人去买此内存条, win表示获取到此内存条,这个人最多只能拥有一个内存条,并且同时也保证买不同型号内存条的只会有一个顾客,问此人能获得的最大收益。
思路分析 : 输出答案得是高精度,选购物品的时候贪心的去选, 因为 2^5 一定大于 2^1 + 2^2 + 2^3 + 2^4。
代码示例 :
#define ll long long
const int maxn = 1e6+5;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f; int n;
struct node
{
int state, x; // 1 是 win, 0 是 sell
int pt; // 1 是存在
}pre[5005];
vector<int>f[2005];
int p[2005];
vector<int>ans, mid; void init() {
f[0].push_back(1); for(int i = 1; i <= 2000; i++){
f[i].assign(f[i-1].size(), 0);
for(int j = 0; j < f[i].size(); j++){
f[i][j] = f[i-1][j] + f[i-1][j];
}
for(int j = f[i].size()-1; j >= 0; j--){
if (f[i][j] > 9){
f[i][j] -= 10;
if (j != 0) f[i][j-1]++;
else f[i].insert(f[i].begin(), 1);
}
}
}
} void bigsum(int x){
mid.clear();
mid.assign(ans.size(), 0); for(int i = ans.size()-1, j = f[x].size()-1; i >= 0; ){
if (j >= 0){
mid[i] = ans[i] + f[x][j];
i--, j--;
}
else {mid[i] = ans[i]; i--;}
} for(int i = mid.size()-1; i >= 0; i--){
if (mid[i] > 9){
mid[i] -= 10;
if (i != 0) mid[i-1]++;
else mid.insert(mid.begin(), 1);
}
}
ans = mid;
} int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n;
char s[10];
int x; init();
for(int i = 1; i <= n; i++) {
scanf("%s%d", s, &x);
if (s[0] == 'w') pre[i].state = 1;
else {
pre[i].state = 0;
p[x] = i;
}
pre[i].x = x; pre[i].pt = 1;
} int sign = 1;
for(int i = 2000; i >= 0; i--){
if (!p[i]) continue;
int pos = 999999;
for(int j = p[i]-1; j >= 1; j--){
if (pre[j].pt == 0) break;
if (pre[j].state == 1 && pre[j].x == i){
pos = j;
if (sign) {ans = f[i]; sign = 0;}
else bigsum(i);
break; }
}
for(int j = p[i]; j >= pos; j--){
if (pre[j].state == 0) p[pre[j].x] = 0;
else pre[j].pt = 0;
}
//printf("----- %d %d\n", i, pos);
}
if (sign) {printf("0\n"); return 0;}
for(int i = 0; i < ans.size(); i++){
printf("%d", ans[i]);
}
printf("\n");
//puts("");
return 0;
}
CF - 高精度 + 贪心的更多相关文章
- CF/div2c/贪心
题目链接[http://codeforces.com/contest/749/problem/C] 题意:给出一个长度为n序列包含D和R,每一轮操作的先后顺序是1-n,规则是每一轮每个人有一次机会杀掉 ...
- *cf.4 贪心
D. Kostya the Sculptor time limit per test 3 seconds memory limit per test 256 megabytes input stand ...
- CF #374 (Div. 2) D. 贪心,优先队列或set
1.CF #374 (Div. 2) D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...
- CF 628C --- Bear and String Distance --- 简单贪心
CF 628C 题目大意:给定一个长度为n(n < 10^5)的只含小写字母的字符串,以及一个数d,定义字符的dis--dis(ch1, ch2)为两个字符之差, 两个串的dis为各个位置上字符 ...
- 【Noip2012】解题报告【字符】【贪心】【高精度】【倍增】【set】
目录:1:vigenere密码[字符]2:国王游戏[贪心][高精度]3:开车旅行[倍增][set] 题目: VJ P1778 vigenere密码 Accepted 标签:NOIP提高组2012 ...
- POJ 2325 Persistent Numbers#贪心+高精度除法
(- ̄▽ ̄)-* 这道题涉及高精度除法,模板如下: ]; ];//存储进行高精度除法的数据 bool bignum_div(int x) { ,num=; ;s[i];i++) { num=num*+ ...
- P1080 国王游戏 贪心 高精度
题目描述 恰逢 HH国国庆,国王邀请nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 nn 位大臣排成一排,国王站在队伍的 ...
- luogu1080 国王游戏(贪心+高精度)
貌似这道题是碰巧蒙对了贪心的方式..就是把ai*bi越小的放在越前面 (不过也符合直觉) 然后统计答案需要用高精度,然后就调了一年 #include<cstdio> #include< ...
- Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...
随机推荐
- [转]解决pip安装太慢的问题
阅读目录 临时使用: 经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解 ...
- QQ三方登录
申请了十天,最终通过了审核,能够上线了,事实上申请的第一天,站点的qq登录已经做好了,而且能够用測试帐号登录,但提交审核后,总是通只是,提示:您的站点审核未通过.原因是"未放置QQ登录but ...
- 2019年第二阶段我要变强个人训练赛第八场 B.序列(seq)
传送门 B.序列(seq) •题目描述 给出一个长度为n的序列a,每次对序列进行一下的某一个操作. •输入 第一行两个整数n,q表示序列长度和操作个数. 接下来一行n个数,表示序列a. 接下来q行表示 ...
- 给培训学校讲解ORM框架的课件
导读:这是我给某培训学校培训.net程序员所设计的课件,他们普遍反映太难了,是这样吗?
- activiti工作流引擎学习(三)
5.接收任务活动(receiveTask,即等待活动)不是一个任务节点 接收任务是一个简单任务,他会等待回应消息的到达,当前,官方只实现了这个任务的java语义,当流程达到接受任务,流程状态会保存到数 ...
- SPOJ - DISUBSTR Distinct Substrings (后缀数组)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- Nodejs之使用express框架搭建WEB应用
首先创建一个index.js,在里面引入相关的中间件,如果没有这些中间件,则需要在nodejs里进入index.js所在的文件夹安装这些模块,安装命令:npm install express ex ...
- (转载)window安装mysql
一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comp ...
- freemarker<一>
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序. 所谓模板,就是一份已 ...
- Python之time模块和datatime模块
import time time.sleep(5) #休眠 time.time() #返回系统时间戳 utc时间秒数 time.ctime() #返回字符串时间格式,也可以传入参数转换为字符串时间ti ...