05 贪心

最小平均等待时间

题目描述

有n个顾客同时在等待一项服务,顾客i需要的服务时间为ti,1≤i≤n。要安排一个服务次序使得平均等待时间最小(平均等待时间是n个顾客等待服务时间的总和除以n)。请编写算法,计算最小平均等待时间。

输入

第一行为测试用例个数m,m≤1000。 第二行开始为m个测试用例,每个测试用例由一组空格间隔的整数组成,第一个整数n为顾客的人数,后面n个整数为每个顾客需要的服务时间t,0<m≤1000,0<t≤1000。

输出

对每个测试用例,输出最小平均等待时间的整数部分(舍去小数部分),每个输出占一行。

样例输入 复制

2
5 15 9 3 14 3
10 13 3 12 9 6 9 1 91 44 32

样例输出 复制

10
36
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int m;
    cin>>m;
    while(m--)
    {
        int n;
        int a[1005];
        cin>>n;
        for(int i=0;i<n;i++)
        cin>>a[i];
        sort(a,a+n);
        int total=0;
        for(int i=0;i<n;i++)
        total+=a[i]*(n-i-1);
        cout<<total/n<<endl;
    }
 } 

最少货币支付问题

题目描述

现行的货币体系为(1、2、5、10、20、50、100),请设计算法,计算要用最少的货币数支付指定金额N,每种货币需要使用的数量。

输入

第一行为测试用例个数n,n≤1000。 后面n行,每行为一个测试用例,每个测试用例为一个大于0的整数目标金额m,0≤m≤10000。

输出

对每个测试用例,输出一行由空格间隔的7个整数,分别表示1元、2元、5元、10元、20元、50元、100元所使用的数量。

样例输入 复制

2
15
189

样例输出 复制

0 0 1 1 0 0 0 
0 2 1 1 1 1 1 
#include<bits/stdc++.h>
int main()
{
	int n,N;
	scanf("%d",&N);
	while(N--)
	{
		int a=0,b=0,c=0,d=0,e=0,f=0,g=0;
		scanf("%d",&n);
		while(n>=100)
		{
			g=g+1;
			n=n-100;
		}
		while(n>=50&&n<100)
		{
			f=f+1;
			n=n-50;			
		}
		while(n>=20&&n<50)
		{
			e=e+1;
			n=n-20;			
		}
		while(n>=10&&n<20)
		{
			d=d+1;
			n=n-10;			
		}
		while(n>=5&&n<10)
		{
			c=c+1;
			n=n-5;			
		}
		while(n>=2&&n<5)
		{
			b=b+1;
			n=n-2;			
		}
		if(n>0&&n<2)
		{
			a=1;
		}
		printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,f,g);
	}
 } 

活动安排

 有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?

#include<bits/stdc++.h>
using namespace std;
struct Task
{
    int s;
    int f;
}task[1005];
bool comparsion(Task a,Task b)
{
    return a.f<b.f; 
}
int main()
{
    int n;
    cin>>n;
     
    for(int i=0;i<n;i++)
    cin>>task[i].s>>task[i].f;
    sort(task,task+n,comparsion);
    int cnt=1;
    int finish=task[0].f;
    for(int i=1;i<n;i++)
    {
        if(task[i].s>=finish) 
        {
            cnt++;
            finish=task[i].f;
        }
    }
    cout<<cnt;
     
 } 

数列极差

题目描述

佳佳的老师在黑板上写了一个由 n 个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数 a 和 b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数为止,在所有按这种操作方式最后得到的数中,最大的为max,最小的为 min, 则该数列的极差定义为 M=max−min。

由于佳佳忙于准备期末考试,现请你帮助他,对于给定的数列,计算出相应的极差 M。

输入格式

第一行为一个正整数 n 表示正整数序列的长度;
在接下来的 n 行中,每行输入一个正整数。
接下来的一行有一个 0,表示数据结束。

输出格式

输出只有一行,为相应的极差 d。

样例

样例输入

3
1
2
3
0
样例输出

2

#include<bits/stdc++.h>
using namespace std;
 
int jicha()
{
    int n;
    cin>>n;
    int a[50005];
    for(int i=0;i<n;i++)
    cin>>a[i];
    int b;
    cin>>b;
    long long min=a[n-1],max=a[0];
    sort(a,a+n);
    for(int i=1;i<n;i++)
    max=max*a[i]+1;
    for(int i=n-2;i>=0;i--)
    min=min*a[i]+1;
    cout<<max-min<<endl;
}
int main()
{
    long long a[50005],b[50005];
    int n;
    cin>>n;
        long long maxx,minn;
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
            b[i]=a[i];
        }
        int x;
        cin>>x;
        sort(a,a+n);
        sort(b,b+n);
        for(int i=n-1; i>0; i--) //计算min
        {
            a[i-1]=a[i]*a[i-1]+1;
            sort(a,a+i);
        }
        minn=a[0];
        for(int i=0; i<n-1; i++) //计算max
        {
            b[i+1]=b[i]*b[i+1]+1;
           sort(b+i+1,b+n);
        }
        maxx=b[n-1];
        cout<<maxx-minn<<endl;
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值