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\n",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\n",sum); } return 0; }