2、猫吃鱼
第10届蓝桥杯C++青少组省赛2019年真题 | 考级竞赛题库
始终记录经过站点买鱼的最小花费,如果当前站点买鱼的价格比最小花费低,就将当前站点买鱼的价格赋值给最小花费,加上总共费用中。然后在去往下个站点的时候,将当前站点的运费算在最小花费中。
#include<iostream>
using namespace std;
int buy[200],yun[200];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>buy[i]>>yun[i];
}
int minmoney=1000000,sum=0;//最小的费用,总共的费用
for(int i=1;i<=n;i++){
if(minmoney>buy[i])
minmoney=buy[i];//最小的买鱼费用
sum+=minmoney;
minmoney+=yun[i];//加上当前的运费
}
cout<<sum;
return 0;
}
3、评选最佳品牌
#include<iostream>
using namespace std;
string a[2000];
int t[20];
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(1){
for(int i=1;i<=m;i++){
if(t[i]>0){
t[i]=0;
}
}
//计算投票
for(int i=1;i<=n;i++){
string s=a[i];
for(int j=0;j<s.size();j++){
int p=s[j]-'0';
if(p == 0){//0弃票
break;
}
else{
if(t[p]>=0){//给对应编号投票
t[p]++;
break;
}
}
}
}
//通过票数的最小值和最大值是否相等来看是否结束
int max=0,min=20000;
for(int i=1;i<=m;i++){
if(t[i]>max){
max=t[i];
}
if( t[i]!=-1 && t[i]<min )
min=t[i];
}
int bh,cnt=0;
if(max==min){//最大值和最小值相等
for(int i=1;i<=m;i++){//计算最大值的个数
if(t[i]==max){
cnt++;
bh=i;
}
}
if(cnt>1)//最大值多余1个,说明评选失败
cout<<'-'<<max;
else//最大值只有1个,评选成功
cout<<bh;
break;
}
else{//最大值最小值不等,则需要进行下一次的评选
for(int i=1;i<=m;i++){
if(t[i]==min){
t[i]=-1;
}
}
}
}
return 0;
}
4、最大购物优惠
#include<iostream>
using namespace std;
int dp[110][110][110];
string s[110][110][110];
int ww[110],vv[110],ll[110];
int main(){
int w,v,n;
cin>>w>>v>>n;
for(int i=1;i<=n;i++){
cin>>ww[i]>>vv[i]>>ll[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=w;j++){//重量
for(int k=1;k<=v;k++){//体积
if(j<ww[i] || k<vv[i]){
dp[i][j][k]=dp[i-1][j][k];
s[i][j][k] = s[i-1][j][k];
}
else{
int nn = dp[i-1][j-ww[i]][k-vv[i]] + ll[i];
int bn = dp[i-1][j][k];
if(nn > bn){
dp[i][j][k] = nn;
s[i][j][k] = s[i-1][j-ww[i]][k-vv[i]] + (char)(i+'0')+" ";
}
else{
dp[i][j][k] = bn;
s[i][j][k] = s[i-1][j][k];
}
}
}
}
}
cout<<dp[n][w][v]<<endl;
cout<<s[n][w][v];
return 0;
}
5、蓝桥杯迷宫
#include<iostream>
using namespace std;
char dt[110][110];
char visit[110][110];
int n,m;
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
int step=1,ans=0;
int dfs(int x,int y){
if(dt[x][y] == 'L') visit[x][y]=1;
char next;
if(dt[x][y] == 'L') next = 'Q';
if(dt[x][y] == 'Q') next = 'B';
if(dt[x][y] == 'B') next = 'S';
if(dt[x][y] == 'S') next = 'L';
for(int i=1;i<=4;i++){
int xx = x + dx[i];
int yy = y + dy[i];
//合法的下标,并且是下一个字符,且已经访问过
if(xx>=1 && yy>=1 && xx<=n && yy<=m && dt[xx][yy]==next && visit[xx][yy])
return -1;
else if(xx>=1 && yy>=1 && xx<=n && yy<=m && dt[xx][yy]==next){
visit[xx][yy]=1;
step++;
if( dfs(xx,yy)==-1 ) return -1;//循环了
visit[xx][yy]=0;//回溯
if(step/4 > ans) ans=step/4;//计算当前走过几遍
step-=1;//回溯后步数减1
}
}
return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>dt[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(dt[i][j] == 'L'){
visit[i][j]=0;
if(dfs(i,j)==-1){
ans=-1;//循环了
break;
}
}
}
if(ans==-1)
break;
}
cout<<ans;
return 0;
}