百练OJ——C/C++测试(笔记)

适合于练手,从而建立信心,还是挺easy的。
传送门:C/C++测试

A:找和最接近但不超过K的两个元素

简单模拟

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int a[1005];

int main()
{
    
    
	int n,k;
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
    
    
		cin>>a[i];
	}
	int ans=0;
	for(int i=0;i<n;i++)
	{
    
    
		for(int j=i+1;j<n;j++)
		{
    
    
			if(a[i]+a[j]<=k)
			{
    
    
				ans=max(ans,a[i]+a[j]);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

B:附近编号最大的城市

dijkstra模板题

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int n,k;
int g[1005][1005];
int dist[1005];
bool vis[1005];

void dij(int s)
{
    
    
	memset(dist,0x3f,sizeof(dist));
	memset(vis,false,sizeof(vis));
	dist[s]=0;
	for(int i=0;i<n;i++)
	{
    
    
		int v=0,minv=0x3f3f3f3f;
		for(int j=1;j<=n;j++)
		{
    
    
			if(!vis[j]&&dist[j]<minv)
			{
    
    
				minv=dist[j];
				v=j;
			}
		}
		vis[v]=true;
		for(int j=1;j<=n;j++)
		{
    
    
			if(!vis[j])
			{
    
    
				dist[j]=min(dist[j],dist[v]+g[v][j]);
			}
		}
	}
}

int main()
{
    
    
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=n;j++)
		{
    
    
			cin>>g[i][j];
		}
	}
	dij(1);
	int ans=1;
	for(int i=1;i<=n;i++)
	{
    
    
		if(dist[i]<=k)
		{
    
    
			ans=max(ans,i);
		}
	}
	cout<<ans<<endl;
	return 0;
}

C:硬币问题

完全背包模板题

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n,v;
int c[110],w[110];
int dp[110];

int main()
{
    
    
	cin>>n>>v;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>c[i];
	}
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>w[i];
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=c[i];j<=v;j++)
		{
    
    
			dp[j]=max(dp[j],dp[j-c[i]]+w[i]);
		}
	}
	cout<<dp[v]<<endl;
	return 0;
}

D:制作蛋糕

枚举和模拟,关键是要读懂题意

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    
    
	int m,x,t,y,k;
	cin>>m>>x>>t>>y>>k;
	int ans=0;
	int cnt1=0;
	int cnt2=0;
	for(int i=0;i<=100;i++)
	{
    
    
		int lx=(x-2*i);
		int n1=(k/75);
		int n2=(m-250*i)/200;
		int n3=(t-75*i)/150;
		int n4=(y-100*i)/150;
		if(lx>=0&&n1>=0&&n2>=0&&n3>=0&&n4>=0)
		{
    
    
			int cnt=min(n1,min(n2,min(n3,n4)));
			cnt=min(cnt,100);
			if(ans<400*i+450*cnt)
			{
    
    
				ans=400*i+450*cnt;
				cnt1=i;
				cnt2=cnt;
			}
		}
	}
	cout<<ans<<endl<<cnt1<<endl<<cnt2<<endl;;
	return 0;
}

E:最短路

dfs搜索路径

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n;
int a[20][20];
bool vis[20];
int path[20];
int len=0;
int ans=0x7fffffff;

int p[20];
int lenp=0;

void dfs(int pos,int sum)
{
    
    
	if(sum>ans)
	{
    
    
		return;
	}
	if(pos==n)
	{
    
    
		if(sum<=ans)
		{
    
    
			ans=sum;
			lenp=len;
			for(int i=0;i<len;i++)
			{
    
    
				p[i]=path[i];
			}
		}
		return ;
	}
	for(int j=1;j<=n;j++)
	{
    
    
		if(!vis[j])
		{
    
    
			vis[j]=true;
			path[len++]=j;
			dfs(j,sum+a[pos][j]);
			vis[j]=false;
			len--;
		}
	}
}

int main()
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=n;j++)
		{
    
    
			cin>>a[i][j];
		}
	}
	dfs(1,0);
	cout<<ans<<endl;
	cout<<1<<" ";
	for(int i=0;i<lenp;i++)
	{
    
    
		if(i!=lenp-1)
		{
    
    
			cout<<p[i]<<" ";
		}
		else
		{
    
    
			cout<<p[i]<<endl;
		}
	}
	return 0;
}

F:木材切割

二维dp问题

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int n,m;
int a[110];
int dp[110][110];

int main()
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
    
    
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
    
    
		dp[i][1]=a[i];
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=min(m,i);j++)
		{
    
    
			for(int k=0;k<=i-1;k++)
			{
    
    
				dp[i][j]=max(dp[i][j],dp[k][j-1]+a[i-k]);
			}
		}
	}
	cout<<dp[n][m]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/108519826