OJ《程序设计基础II》实验5——贪心

28 篇文章 2 订阅
17 篇文章 1 订阅

5-1 A - 删数问题

#include<stdio.h>
#include<string.h>
int main()
{
	char a[101];
	int s;
	scanf("%s %d",a,&s);//将输入整数看成字符串会比较好做
	int n=strlen(a);
	while(s--)//删几个数
	{
		int i=0;
		while(a[i]<=a[i+1]&&i+1<n)//由题意可知,从0位置开始往后,如果数是递增的,则删去最后一个,如果是递减的,则删去第一个,如果是先增后减的,则删去极值,这个写一些例子就能得出这样的规律;
		{
			i++;//确定删数的位置
		}
		if(i!=n-1)
		{
			for(int j=i;j<n;j++)
			{
				a[j]=a[j+1];//这样操作的结果是要删的数被删掉了,结尾变成0;
			}
		}
		n--;//结尾0也没了
	}
	int m=0;//另找一个数开始判断剩下的数中有0的情况,因为剩下001或者00这种,只需要输出“1”或者“0”;
	while(a[m]=='0'&&m<n) m++;//确定非0数的位置和全为0的情况
	if(m==n) printf("0");
	else
	{
		for(int j=m;j<n;j++)
		{
			printf("%c",a[j]);
		}
	}
	return 0;
}

5-2 B - 活动选择

#include<stdio.h>
struct node
{
	int begin,end,num;
}a[101],t;
int main()
{
	int n;
    scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&a[i].begin,&a[i].end);
		a[i].num=i+1;//确定每个的序号
	}
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(a[j].end>a[j+1].end)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}//按结束时间顺序排好,本题只需要按结束时间进行排序,然后找出后面哪几个开始时间在前面一个结束时间之后即可
	int now=a[0].end;//令第一个为结束时间
	printf("%d",a[0].num);
	for(int i=1;i<n;i++)
	{
		if(a[i].begin>=now)//比较
		{
			printf(",%d",a[i].num);
			now=a[i].end;//定义了新的结束时间
		}
	}
	return 0;
}

5-3 C - 活动选择问题

#include<stdio.h>
struct node
{
	int begin,end;
}a[101],t;
int main()
{
	int n;
    scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&a[i].begin,&a[i].end);
	}
	for(int i=0;i<n-1;i++)
	{
		for(int j=0;j<n-i-1;j++)
		{
			if(a[j].end>a[j+1].end)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	int now=a[0].end;//到此为止和上面的题差不多;
	int b=1;//这里有些变化,首先因为第一个活动a[0]肯定可以举办,所以定义b=1;
	for(int i=1;i<n;i++)
	{
		if(a[i].begin>=now)
		{
			b++;//统计个数
			now=a[i].end;
		}
	}
	printf("%d",b);
	return 0;
}

5-4 D - 区间覆盖问题

#include <stdio.h>
void sort(int *a,int n,int flag)
{
    int t;
    if(flag==1)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n-i-1; j++)
            {
                if(a[j]>a[j+1])
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
    }//冒泡升序 
    else
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n-i-1; j++)
            {
                if(a[j]<a[j+1])
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
    }//冒泡降序 
}
int main()
{
    int n,m;
    int a[201],b[201];//b指两区间之间的间隔,比如1于3区间之间的间隔为1 
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        if(n<=m)
            printf("%d\n",n);//坐标数小于等于段数时,长度于段数相同 
        else
        {
            sort(a,n,1);//首先把各坐标排升序 
            for(int i=0;i<n-1;i++)
                b[i]=a[i+1]-a[i]-1;//找到各坐标区间之间的距离 
            sort(b,n-1,0);//将距离按降序排列 
            int all=a[n-1]-a[0]+1;//定义一个总长度 
            for(int i=0;i<m-1;i++)//这是所需要的段数 
                all=all-b[i];//我们所求段数和最小时,说明它是总长度减去最多的区间之间的距离,所以我们只需要减掉最大的m-1个区间之间的距离,即b即可; 
            printf("%d\n",all);
        }
    }
    return 0;
}

5-5 E - 最少拦截系统

#include <stdio.h>
int q[1000100];
int n;
int main()
{
    scanf("%d", &n);
    for (int i=0;i<n;i++) 
	scanf("%d",&q[i]);
    int res=0,ans=0;
    for(int i=0;i<n;i++) 
    {
        if (q[i]!=0)
        {
            res=q[i];
            q[i]=0;
            for(int j=i+1;j<n;j++)
            {
                if(q[j]<=res&&q[j]!=0) 
                {
                    res = q[j];
                    q[j] = 0;
                }
            }
            ans++;
        }
    }//自己找个例子写一写就明白了。大体是遍历数组,某数组元素及后面比它小的都变成0除去了
    printf("%d",ans);
    return 0;
}

5-6 F - 悼念512汶川大地震遇难同胞

#include <stdio.h>
struct node
{
	int p,h;
}a[1001],t;
int main()
{
	int n,m,i,j;
	scanf("%d %d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d %d",&a[i].p,&a[i].h);
	}
	for(i=0;i<m;i++)
	{
		for(j=0;j<m-i-1;j++)
		{
			if(a[j].p>a[j+1].p)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}//将不同种类的大米按每斤价格从低到高排列 
	double ans=0;
	for(i=0;i<m;i++)
    {
        if(a[i].h*a[i].p>n)
        {
            break;
        }
        ans=ans+a[i].h*1.0;//先买便宜的,如果全部买便宜的钱都不够的话就直接退出循环,如果钱够了,就用剩下的钱去买贵的 
        n=n-a[i].h*a[i].p;
    }
    ans=ans+n*1.0/a[i].p;
    printf("%.2f",ans);
    return 0;
}

5-7 G - 懒虫小鑫

#include <stdio.h>
#include <string.h>
struct node
{
    int w,p;
}a[10001],t;
void sort(int l,int r)//快排,按从小到大排重量,相同重量的从大到小排价格
{
    t=a[l];
    int i=l,j=r;
    if(l>=r) return;
    while(i<j)
    {
        while((a[j].w>t.w||(a[j].w==t.w&&a[j].p<=t.p))&&i<j) j--;
        a[i]=a[j];
        while((a[i].w<t.w||(a[i].w==t.w&&a[i].p>=t.p))&&i<j) i++;
        a[j]=a[i];
    }
    a[i]=t;
    sort(l,i-1);
    sort(i+1,r);
}
int main()
{
    int n,m;
    scanf("%d %d",&n,&m); 
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&a[i].w,&a[i].p);
    }
    sort(0,n-1);
    int ans=0;
    for(int i=0;i<m;i++)
    ans=ans+a[i].p;
    printf("%d\n",ans);
    return 0;
}//快排完了直接算,没啥好说的

5-8 装船问题

#include <stdio.h>
#include <string.h>
struct node
{
    int p,w,x;
} a[10001],t;
void sort(int l,int r)
{
    t=a[l];
    int i=l,j=r;
    if(l>=r)
        return;
    while(i<j)
    {
        while(i<j&&a[j].x<=t.x) j--;
        a[i]=a[j];
        while(i<j&&a[i].x>=t.x) i++;
        a[j]=a[i];
    }
    a[i]=t;
    sort(l,i-1);
    sort(i+1,r);
}
int main()
{
    int M,i;
    scanf("%d",&M);
    for(i=0; i<10; i++)
    {
        scanf("%d %d",&a[i].p,&a[i].w);
        a[i].x=a[i].p/a[i].w;
    }
    sort(0,9);
    int ans=0;
    for(i=0;i<10;i++)
    {
        if(a[i].w<=M)
        {
            ans=ans+a[i].p;
            M=M-a[i].w;
        }
        else 
        {
           ans=ans+M*a[i].x; 
           break;
        }
    }    
    printf("%d",ans);
    return 0;
}//与上一题差不多

5-9 I - 商人小鑫

#include <stdio.h>
#include <string.h>
int a[10000001],t;
void sort(int l,int r)//快排
{
    t=a[l];
    int i=l,j=r;
    if(l>=r)
        return;
    while(i<j)
    {
        while(i<j&&a[j]<=t) j--;
        a[i]=a[j];
        while(i<j&&a[i]>=t) i++;
        a[j]=a[i];
    }
    a[i]=t;
    sort(l,i-1);
    sort(i+1,r);
}
int main()
{
    int n,m,i,c,p;
    scanf("%d %d",&n,&m);
    for(i=0; i<n; i++)
    {
        scanf("%d %d",&c,&p);
        a[i]=p-c;
    }
    sort(0,n-1);
    int ans=0;
    for(i=0;i<m;i++)
    {
        ans=ans+a[i];
    }
    printf("%d",ans);
    return 0;
}
 

5-10 J - 商人的诀窍

#include <stdio.h>
#include <string.h>
struct node
{
	int f,m;
	double x;
}a[55],t;
void sort(int l,int r)
{
    t=a[l];
    int i=l,j=r;
    if(l>=r)
        return;
    while(i<j)
    {
        while(i<j&&a[j].x>=t.x) j--;
        a[i]=a[j];
        while(i<j&&a[i].x<=t.x) i++;
        a[j]=a[i];
    }
    a[i]=t;
    sort(l,i-1);
    sort(i+1,r);
}
int main()
{
    int N,M,i,c,p;
    scanf("%d %d",&N,&M);
    for(i=0;i<M;i++)
    {
        scanf("%d %d",&a[i].f,&a[i].m);
        a[i].x=a[i].m*1.0/a[i].f*1.0;
    }
    sort(0,M-1);
    double ans=0;
    for(i=0;i<M;i++)
    {
        if(a[i].m>N)
		{
			ans=ans+N/a[i].x;
		    break;
		}
        else
        {
        	ans=ans+a[i].f*1.0;
        	N=N-a[i].m;
		}
    }
    printf("%.3lf",ans);
    return 0;
}
 

加油加油加油!!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRAEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值