poj1323,poj2586贪心容易题
2015-10-17 22:38
537 查看
poj1323
//,M个人,每人N张牌,每轮比较谁出的牌大,最大者为胜。现在给定M和N,以及你的牌, //要求输出你至少能确保获得几轮的胜利每个人得到的牌是不同的 //136K 0MS #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <functional> using namespace std; #define MAXN 60 int m,n; int pip[MAXN]; int used[1160]; int main() { int ncase = 1; while(scanf("%d %d",&m,&n)&&m&&n) { memset(used,0,sizeof(used)); for (int i=0;i<n;++i) { scanf("%d",&pip[i]); } //降序排列 sort(pip,pip+n,greater<int>()); int nmax = n*m; int ans = 0; memset(used,0,sizeof(used)); for (int s=nmax,i=0;s>0&&i<n;++i) { if (s==pip[i]) { s--; ans++; used[pip[i]] = 1; } else { used[pip[i]] = 1; while (used[s-1])s--; s--; } } printf("Case %d: %d\n",ncase,ans); ncase++; } return 0; }
poj2586
//对于MS Inc来说,每个月如果盈利则必盈利sur,如果亏空则必亏空def(这个公司很怪)。它每五个月进行一次统计,共统计八次(1-5月一次,2-6月一次...)。 //计的结果是这八次都亏空。判断MS Inc全年否能盈利,如果能则求出最大的盈利。如果不能则输出"Deficit" //132K 0MS #include <iostream> #include <string.h> #include <stdio.h> using namespace std; int s,d; //由于8次都亏空 int used[20]; int main() { while(~scanf("%d %d",&s,&d)) { int n1 = 0; //最大的盈利 for (int i=4;i>=0;--i) { if (d*(5-i)>s*i) { n1 = 5-i; break; } } memset(used,0,sizeof(used)); //放在末尾可以用粘贴-复制的方法验证是否是最优解 int rest = n1; int cnt = 0; for (int i=1;i<=8;++i) { int j = i+4; if (rest>0)cnt+=rest; while (rest>0) { used[j] = 1; j--; rest--; } if (used[i])rest++; } int ans = (12-cnt)*s - cnt*d; if (ans>0) printf("%d\n",ans); else printf("Deficit\n"); } return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例