SDUT ACM OJ PTA 实验五 贪心

A-活动选择

#include<stdio.h>
#include<stdlib.h>

struct sk
{
	int h;
	int k;
	int j;
}a[105],t;

int main()
{
	int n,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		a[i].h=i;
		scanf("%d %d",&a[i].k,&a[i].j);
	}
	for(i=n;i>1;i--)
	{
		for(j=1;j<i;j++)
		{
			if(a[j].j>a[j+1].j)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	int k=a[1].j;
	printf("%d",a[1].h);
	for(i=2;i<=n;i++)
	{
		if(a[i].k>=k)
		{
			k=a[i].j;
			printf(",%d",a[i].h);
		}
	}
	printf("\n");
}

B-删数问题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	int n,i,l;
	char s[105];
	scanf("%s %d",s,&n);
	while(n--)
	{
		i=0;
		l=strlen(s);
		while(i<l&&s[i]<=s[i+1])
		{
			i++; 
		}
		while(i<l)
		{
			s[i]=s[i+1];
			i++;
		}
	}
	while(s[0]=='0')
	{
		i=0;
		l=strlen(s);
		while(i<l)
		{
			s[i]=s[i+1];
			i++;
		}
	}
	l=strlen(s);
	if(l==0){printf("0\n");return 0;}
	else puts(s);
}

C-活动选择问题

#include<stdio.h>
#include<stdlib.h>

struct sk
{
	int k;
	int j;
}a[105],t;

int main()
{
	int n,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d %d",&a[i].k,&a[i].j);
	}
	for(i=n;i>1;i--)
	{
		for(j=1;j<i;j++)
		{
			if(a[j].j>a[j+1].j)
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	int k=a[1].j,h=1;
	for(i=2;i<=n;i++)
	{
		if(a[i].k>=k)
		{
			k=a[i].j;
			h++; 
		}
	}
	printf("%d\n",h);
}

D-区间覆盖问题

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
	return *(int *)b-*(int *)a;
}
int main()
{
	int n,m;
	while(~scanf("%d %d",&n,&m))
	{
		int a[202],b[202];
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		qsort(a,n,sizeof(a[0]),cmp);
		for(int i=0;i<n-1;i++)
		{
			b[i]=a[i]-a[i+1]-1;
		}
		qsort(b,n-1,sizeof(b[0]),cmp);
		int sum=a[0]-a[n-1]+1,k=0,i=1;
		while(i<m&&b[k]>0)
		{
			i++;
			sum-=b[k];
			k++;
		}
		printf("%d\n",sum);
	}
}

E-最少拦截系统

#include<stdio.h>
#include<stdlib.h>
int a;
int b[100000]={0};
int main()
{
	int n,m;
	while(~scanf("%d",&n))
	{
		m=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a);
			int j;
			for(j=0;j<=m;j++)
			{
				if(b[j]>=a){b[j]=a;break;}
			}
			if(j>m){b[++m]=a;} 
		}
		printf("%d\n",m);
	}
}

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

#include<stdio.h>
#include<stdlib.h>

struct dm
{
	int dj;
	int sl;
}s[1005],k;

int main()
{
	int m,n,i,j;
	double sum=0;
	scanf("%d %d",&n,&m);
	for(i=0;i<m;i++)  {scanf("%d %d",&s[i].dj,&s[i].sl);}
	for(i=m-1;i>1;i--)
	{for(j=0;j<i;j++){if(s[j].dj>s[j+1].dj){k=s[j];s[j]=s[j+1];s[j+1]=k;}}}
	for(i=0;i<m;i++)
	{
		if(n>=s[i].dj*s[i].sl)
		{
			sum+=s[i].sl;
			n-=s[i].dj*s[i].sl;
		}
		else if(n==0) 
			break;
		else if(n>0&&n<s[i].dj*s[i].sl)
		{
			sum+=(n*1.0)/s[i].dj;
			n=0;
		}
	}
	printf("%.2lf",sum);
}

G-懒虫小鑫

#include<stdio.h>
#include<stdlib.h>

struct dm
{
	int zl;
	int jg;
}s[10005],t;

int main()
{
	int m,n,i,j,sum1=0,sum2=0;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++) {scanf("%d %d",&s[i].zl,&s[i].jg);sum1+=s[i].jg;}
	if(m>=n) printf("%d\n",sum1);
	else
	{
		for(i=n-1;i>0;i--)
		{
			for(j=0;j<i;j++)
			{
				if(s[j].zl>s[j+1].zl)
				{
					t=s[j];s[j]=s[j+1];s[j+1]=t;
				}
				else if(s[j].zl==s[j+1].zl)
				{
					if(s[j].jg<s[j+1].jg)
					{
						t=s[j];s[j]=s[j+1];s[j+1]=t;
					}
				}
			}
		}
		for(i=0;i<m;i++)
		{
			sum2+=s[i].jg;
		}
		printf("%d\n",sum2);
	}
}

H-装船问题

#include<stdio.h>
#include<stdlib.h>

struct dm
{
	int jg;
	int zl;
	int bz;
}s[105],t;

int main()
{
	int n,i,j,sum=0;
	scanf("%d",&n);
	for(i=0;i<10;i++)
	{
		scanf("%d %d",&s[i].jg,&s[i].zl);
		s[i].bz=s[i].jg/s[i].zl;
	}
	for(i=9;i>0;i--)
	{
		for(j=0;j<i;j++)
		{
			if(s[j].bz<s[j+1].bz)
			{
				t=s[j];s[j]=s[j+1];s[j+1]=t;
			}
		}
	}
	for(i=0;i<10;i++)
	{
		if(n==0) break;
		else if(n>=s[i].zl)
		{
			sum+=s[i].jg;
			n-=s[i].zl;
		}
		else if(n>0&&n<s[i].zl)
		{
			sum+=s[i].bz*n;
			n=0;
		}
	}
	printf("%d\n",sum);
	return 0;
}

I- 商人小鑫

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
int main()
{
    int n,m,i,j,a,b,s[1000005],sum=0;
	scanf("%d %d",&n,&m);
	for(0;i<n;i++)
	{
		scanf("%d %d",&a,&b);
		s[i]=b-a;
	}
	qsort(s,n,sizeof(int),cmp);
	for(i=0;i<m;i++)
	{
		sum+=s[i];
	}
	printf("%d\n",sum);
}

J-商人的诀窍

#include <stdio.h>
#include <stdlib.h>

struct jueqiao
{
	int zl;
	int jg;
	double zjb;
}s[55],t;

int main()
{
    int n,m,i,j;
    double sum=0,sum1=0,sum2=0;
    scanf("%d %d",&n,&m);
	for(i=0;i<n;i++)
	{
		scanf("%d %d",&s[i].zl,&s[i].jg);
		s[i].zjb=1.0*s[i].zl/s[i].jg;
		sum1+=s[i].zl;
		sum2+=s[i].jg;
	}
	for(i=n-1;i>0;i--)
	{
		for(j=0;j<i;j++)
		{
			if(s[j].zjb<s[j+1].zjb)
			{
				t=s[j];
				s[j]=s[j+1];
				s[j+1]=t;
			}
		}
	}
	if(n>=sum2) printf("%.3lf\n",sum1);
	else
	{
		for(i=0;i<m;i++)
		{
			if(n>=s[i].jg)
			{
				sum+=s[i].zl;
				n-=s[i].jg;
			}
			else
			{
				sum+=s[i].zjb*n;
				n=0;
				break;
			}
		}
		printf("%.3lf\n",sum);
	}
	return 0;
}

不懂得可以私信我,随时解答。
程序有错误请私信我,以及时改正。感谢!

你可能感兴趣的:(acm,c语言,算法,贪心算法)