HDU 浙江科技学院校赛2016

Let's go to play

题意:给你N行信息,F 或者 M 是 表示 女士 或者男士 在 A -- B  之间的日期内有有空。作为主人 你要确定一天使得这一天邀请到的人数最多,并且这一天来得男人和女人一样多。

方法:一年一共366天,把每一天的信息记住,最后遍历一下,看哪一天能够邀请到的人数最多。

非常实用的一个点啊。。以后到了公司说不定可以用得到。写个程序跑一下,算法简直吊炸天。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;

struct node
{
    int a1;
    int b1;
    int c1;
} viss[370];

int main()
{
    int n,a,b;
    char st[5];
    while(~scanf("%d",&n))
    {
        memset(viss,0,sizeof(viss));
        for(int i=0; i<n; i++)
        {
            scanf("%s",st);
            scanf("%d%d",&a,&b);
            if(strcmp(st,"F")==0)
            {
                for(int j=a; j<=b; j++)
                {
                    viss[j].a1++;
                    if(viss[j].a1==viss[j].b1)//只有男生女生有可能一样多的时候才有必要保存更大的值。
                    {
                        viss[j].c1=viss[j].a1;
                    }
                }
            }
            else if(strcmp(st,"M")==0)
            {
                for(int j=a; j<=b; j++)
                {
                    viss[j].b1++;
                    if(viss[j].a1==viss[j].b1)
                    {
                        viss[j].c1=viss[j].b1;
                    }
                }
            }
        }
        int max1=-1;
        for(int i=1; i<=366; i++)
        {
            if(viss[i].c1>max1)
            {
                max1=viss[i].c1;
            }
        }
        printf("%d
",max1*2);//因为保存的是男生或者女生的数量,总人数应该乘二。
    }
    return 0;
}

田忌赛马

题意:给出田忌和齐王马的速度,求最优策略。

方法:这贪心简直绝了。

每次田忌都有三种选择:赢,输,或者平局。

能赢就不输、平局。

能平局就不输。

如果齐王出最好的马的时候,田忌要考虑他最快的马是不是能够战胜齐王最快的马。

如果战胜的了,就战胜。符合了能赢就不输的贪心策略。

如果会战败,那么说明无论田忌出哪一匹马都会败,干脆出一匹最差的。

如果平局,情况就有些复杂:

平局说明不可能赢了,就在平局和输之间做选择。

如果平局的话,没有奖金可以拿,

看一下最差的马是不是能打败齐王,

如果最差的马可以打败齐王最差的马,就打。

直到打不过齐王最差的马,说明最差的马谁都打不过,注定要输,还不如先给那个平局的牺牲了。

这种贪心的思路简直是666.

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

int a[1011],b[1011];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d",&b[i]);
        }
        sort(a,a+n);
        sort(b,b+n);
        int max1=n-1,max2=n-1;
        int min1=0,min2=0;
        int sum=0;
        for(int i=0; i<n; i++)
        {
            if(a[max1]<b[max2])
            {
                min1++;
                max2--;
                sum-=100;
            }
            else if(a[max1]>b[max2])
            {
                max1--;
                max2--;
                sum+=100;
            }
            else
            {
                if(a[min1]>b[min2])
                {
                    sum+=100;
                    min1++;
                    min2++;
                }
                else
                {
                    if(a[min1]<b[max2])
                    {
                        sum-=100;
                    }
                    min1++;
                    max2--;
                }
            }
        }
        printf("%d
",sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/qioalu/p/5334280.html