HNU数据结构与算法-作业七

1.黑板上的数

#include<iostream>
#include<algorithm>
using namespace std;
char bit[105];

int main()
{
	int k,sum=0;
	cin>>k;
	
	cin>>bit;
	
	int i=0;
	for(;bit[i]!='\0';i++)
	sum+=(bit[i]^48);
	
	if(sum>=k)
	{
		cout<<0;
		return 0;
	}
	
	sort(bit,bit+i,less<int>());

	i=0;
	while(sum<k)
	{
		sum+=(9-(bit[i++]^48));
	}
		
	cout<<i;
	return 0;
}

2.新型冠状病毒

#include<iostream>
using namespace std;
int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch<='9' && ch>='0')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

int s[1000005];
int v[1000005];

int main()
{
	int n,k;
	n=read();
	k=read();
	
	for(int i=1;i<=n;i++)
	s[i]=read();
	
	for(int i=1;i<=n;i++)
	v[i]=read();
	
	int Vmax=v[k],Vmin=v[k];
	for(int i=1;i<=n;i++)
	{
		if(s[i]<=s[k])
		{
			Vmax=max(Vmax,v[i]);
		}
		else if(s[i]>s[k])
		{
			Vmin=min(Vmin,v[i]);
		}
	}
	
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i]==s[k])
		ans++;
		else if(s[i]<s[k] && v[i]>Vmin)
		{
			ans++;
		}
		else if(s[i]>s[k] && v[i]<Vmax)
		{
			ans++;
		}
	}
	
	cout<<ans;
	return 0;
}

3.数组跳远

#include<iostream>
using namespace std;
inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0' || ch>'9')ch=getchar();
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x;
}

int num[200005];

int main()
{
	int t;
	t=read();
	
	while(t--)
	{
		int n;
		n=read();
		
		for(int i=0;i<n;i++)
		{
			num[i]=read();
		}
		
		int ans=0;
		for(int i=n-1;i>=0;i--)
		{
			if(num[i]+i<n)
			num[i]+=num[num[i]+i];
			
			ans=max(ans,num[i]);
		}
		
		printf("%d\n",ans);
	}
	return 0;
}

4.最大报销额

#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;
vector<double> num;
double cnt[4];
double ans=10000000.0;

void DFS(int index,int size,double target)
{	
	if(target>=0)
	ans=min(ans,target);
	
	for(int i=index;i<size;i++)
	{
		if(num[i]<=target)
		DFS(i+1,size,target-num[i]);
	}
}

int main()
{
	while(1)
	{
		double my;
		int n;
		
		cin>>my>>n;
		
		if(n==0)
		break;
		
		num.clear();
		for(int i=0;i<n;i++)
		{
			int m;
			cin>>m;
			
			bool flag=0;
			for(int j=1;j<=3;j++)
			cnt[j]=0;
			
			double sum=0.0;
			for(int j=0;j<m;j++)
			{
				double money;
				char type,ch;
				cin>>type>>ch>>money;
				
				sum+=money;
				
				if(type>'C')
				{
					flag=1;
					continue;
				}
				
				cnt[type^64]+=money;
				
				if(money>600.0)
				flag=1;
				
				if(sum>1000.0)
				flag=1;
			}
			
			if(flag==0)
			{
				num.push_back(sum);
			}
		}
		
		if(num.size()==0)
		{
			cout<<fixed<<setprecision(2)<<0.00<<'\n';
		}
		else
		{
			ans=10000000.0;
			DFS(0,num.size(),my);
			
			if(ans>my)
			cout<<fixed<<setprecision(2)<<0.00<<'\n';
			else
			cout<<fixed<<setprecision(2)<<my-ans<<'\n';
		}
	}
	return 0;
}

5.最小钱币数

#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0' || ch>'9')ch=getchar();
	while(ch>='0' && ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x;
}

int dp[2005];
void init(int m)
{
	for(int i=0;i<=m;i++)
	dp[i]=INF;
}

int main()
{
	int m;
	
	while(1)
	{
		m=read();
		
		if(m==0)
		break;
		
		init(m); 
		int k=read();
		
		dp[0]=0;
		for(int i=1;i<=k;i++)
		{
			int x=read();
			for(int c=x;c<=m;c++)
			{
				dp[c]=min(dp[c],dp[c-x]+1);
			}
		}
		
		if(dp[m]==INF)
		cout<<"Impossible\n";
		else
		cout<<dp[m]<<'\n';
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值