您的位置:首页 > 其它

POJ 2586&&CF 245E

2014-03-05 21:25 176 查看
贪心策略

(这题是真没读懂什么意思)

每连续5个月都是亏损,在贪心选择下,必定会选择尽可能多的盈利月数X,但要使得X*S<(5-X)*d;

而这8个阶段中相邻的阶段都会都相同的四个月的子集,如阶段 1 为 1 - 5 月,阶段 2 为 2 - 6 月,其中的 2 - 5 月就是

公共子集,故应该尽可能在这些重叠区间内安放亏损月以满足题目要求

从而列举所有情况:

1 .若SSSSD亏空,那么全年可能最大盈利情况为: SSSSDSSSSDSS

2.若SSSDD亏空,那么全年可能最大盈利情况为: SSSDDSSSDDSS

3.若SSDDD亏空,那么全年可能最大盈利情况为::SSDDDSSDDDSS

4.若SDDDD亏空,那么全年可能最大盈利情况为::SDDDDSDDDDSD

5.若DDDDD亏空,那么全年可能最大盈利情况为: DDDDDDDDDDDD

#include <iostream>
#include <cctype>
#include <string>
#include <stdio.h>
using namespace std ;

int main()
{
int s, d, re;
while(scanf("%d%d",&s, &d)!=EOF)
{
if(4*s-d<0)
re = 10*s-2*d;
else if(3*s-2*d<0)
re = 8*s-4*d;
else if(2*s-3*d<0)
re = 6*s-6*d;
else if(s-4*d<0)
re = 3*s-9*d;
else
re = -1;
if(re<0)
printf("Deficit\n");
else
printf("%d\n", re);
}
}


CF 245E

Description

Polycarpus just has been out of luck lately! As soon as he found a job in the "Binary Cat" cafe, the club got burgled. All ice-cream was stolen.

On the burglary night Polycarpus kept a careful record of all club visitors. Each time a visitor entered the club, Polycarpus put down character "+" in his notes. Similarly, each time a visitor left the club, Polycarpus
put character "-" in his notes. We know that all cases of going in and out happened consecutively, that is, no two events happened at the same time. Polycarpus doesn't remember whether there was somebody in the club at
the moment when his shift begun and at the moment when it ended.

Right now the police wonders what minimum number of distinct people Polycarpus could have seen. Assume that he sees anybody coming in or out of the club. Each person could have come in or out an arbitrary number of times.

Input

The only line of the input contains a sequence of characters "+" and "-", the characters are written one after another without any separators. The characters are written in the
order, in which the corresponding events occurred. The given sequence has length from 1 to 300 characters, inclusive.

Output

Print the sought minimum number of people

Sample Input

Input
+-+-+


Output
1


Input
---


Output
3


[cpp] view
plaincopy

/*此题要求看过的最少人数。如果看到之前看到人进去,现在看到人出去。那么就把他当做之前看过进去的人 

如果之前看到人出去,现在又看到人进去,也把他们当做同一个人。此题转换为根据我做的进出记录,同时在商店 

中的最大人数*/  

#include <iostream>  

#include <cstdio>  

#include <cstring>  

#include <string>  

using namespace std;  

char A[308];  

int main()  

{  

    while(cin>>A)  

    {  

        int len=strlen(A);  

        int in=0,out=0,sum=0;  

        for(int i=0;i<len;i++)  

        {  

            if(A[i]=='+')  

            {  

                in++;  

                if(out) out--;  

                else sum++;  

            }  

            else   

            {  

                out++;  

                if(in) in--;  

                else sum++;  

            }  

        }  

        cout<<sum<<endl;  

    }  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: