适合于练手,从而建立信心,还是挺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;
}