多处最优服务次序问题:::::
数据输入:
第一行有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;
}