贪心小结


多处最优服务次序问题:::::

数据输入:
  第一行有2 个正整数n 和s,表示有n 个顾客且有s 处可以提供顾客需要的服务。接下来的1 行中,有n个正整数,表示n个顾客需要的服务时间。
结果输出:
  最小平均等待时间。
输入示例:
10 2
56 12 1 99 1000 234 33 55 99 812
输出示例:
336
排序后:::
   0    1  2 3 4 5 6 7 8 9
x  1 12 33 55 56 99 99 234 812 1000
代码实现:
double greed(vector<int> x,int s)
{
  vector<int> st(s+1,0);
  vector<int> su(s+1,0);
  int n = x.size();
  sort(x.begin(),x.end());
  int i=0,j=0;
  while(i < n){
    st[j] += x[i];
    su[j] += st[j];
    ++i,++j;
    if(j == s) j=0;
  }
  double t=0;
  for(i=0;i<s;++i) t += su[i];
  t /= n;
  return t;
************************************************华丽分割线***********************************************
最优分解问题:::
 问题描述:
  设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。
编程任务:
  对于给定的正整数n,编程计算最优分解方案。
数据输入:
  第1 行是正整数n。
结果输出:
  计算出的最大乘积。
输入示例
  10
输出示例
  30
代码实现:
void dicomp()
{
  k=1;
  if(n < 3){ a[1]=0; return; }                        //n=1,2
  if(n < 5){ a[k]=1; a[++k]=n-1; return; }         //n=3,4
  a[1]=2;n -= 2;                                           //a[1]中已经有2
  while(n > a[k])
  {
    k++;
    a[k] = a[k-1]+1;
    n -= a[k];
  }
  if(n == a[k]){ a[k]++; --n; }
  for(int i=0; i < n; ++i) a[k-i]++;
}


void compute(int n)
{
  int r = n%3;
  t[1] = 1; int k = n/3;
  length = 1;                    //大数的长度, 是全局变量
  if(r == 1){ t[1] = 4; k = (n-4)/3; }
  if(r == 2){ t[1] = 2; k = (n-2)/3; }
  for(int i=1; i <= k; ++i) mult(3);  /   /大数运算, 如n=90
  for(i = length; i > 0; --i) cout<< t[i];
  cout<<endl;
}

若a+b=const, 则|a-b|越小,a×b越大。
贪心策略:

******************************************************分割线*******************************************************

区间相交问题:
数据结构:
struct interval{
  int start;
  int end;
};
比较函数:
bool cmp(interval a, interval b) {
  if (a.end<b.end) return true;
  else return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值