编程语言
首页 > 编程语言> > 蓝桥31天|今天3道题Day12|C++

蓝桥31天|今天3道题Day12|C++

作者:互联网

1.打水问题

在这里插入图片描述
贪心

#include<iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int N=1010;
vector<int>num;
vector<vector<int>>pipe;
long long sum[N],ans;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    num.resize(n,0);
    pipe.resize(m);

    for(int i=0;i<n;i++){
       scanf("%d",&num[i]);
    }

    sort(num.begin(),num.end());

    for(int i=0;i<n;i++){
        pipe[i%m].push_back(num[i]);

    }

    for(int i=0;i<m;i++){
        int t=0;
        for(int j=0;j<pipe[i].size();j++){
            //printf("%d\n",pipe[i][j]);
            sum[i]+=t;
            t+=pipe[i][j];
        }
        ans+=sum[i];
    }
    printf("%lld",ans);
    return 0;
}

2.夺宝奇兵

在这里插入图片描述
经典动规

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=110;
int num[N][N];
int dp[N][N];
int main(){
    int n,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            scanf("%d",&num[i][j]);
        }
    }
    dp[1][1]=num[1][1];
    for(int i=2;i<=n;i++){
       for(int j=1;j<=i;j++){
        dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+num[i][j];
       }
    }
    for(int i=1;i<=n;i++){
      ans=max(ans,dp[n][i]);
    }
    printf("%d",ans);
    return 0;
}

3.调手表

在这里插入图片描述
手表可调1、k
完全背包 通过50%
n=10 k=8时
理论上调到6只需要2步,28%10=6

num={8,1}
dp[0][8]=1 dp[1][6]=min(dp[0][6],dp[1][8-k
1])
num={1,8}
dp[0][8]=8 dp[1][6]=min(dp[0][6],dp[1][8-k*8])
都不能得到

#include <iostream>
#include <cstring>
using namespace std;
const int N=1e5+10;
int dp[N];//按的次数
int main()
{
  int n,k;
  int ans=0;
  scanf("%d%d",&n,&k);
  int num[3]={0,1,k};
  memset(dp,0x3f,sizeof dp);
  dp[0]=0;
  for(int i=1;i<=2;i++){
    for(int j=0;j<n;j++){
      dp[j]=min(dp[j],dp[((j-num[i])%n+n)%n]+1);
    }
  }
  for(int i=1;i<n;i++){
     ans=max(dp[i],ans);
  }
  printf("%d",ans);
  return 0;
}

加了初始化,通过80%
剩下两个样例运行错误

#include <iostream>
#include <cstring>
using namespace std;
const int N=1e5+10;
int dp[N];//按的次数
int main()
{
    int n,k;
    int ans=0;
    scanf("%d%d",&n,&k);
    int num[3]= {0,k,1};
    memset(dp,0x3f,sizeof dp);


    for(int i=0;i<n;i++){
        dp[k*i%n]=min(i,dp[k*i%n]);
       // printf("i==%d,index=%d,dp=%d\n",i,k*i%n,dp[k*i%n]);
    }
    for(int i=1; i<=2; i++)
    {
        for(int j=0; j<n; j++)
        {
            dp[j]=min(dp[j],dp[(n+j-num[i])%n]+1);
            //printf("i==%d,j==%d,dp=%d\n",i,j,dp[j]);
        }
    }


    for(int i=0; i<n; i++)
    {
        //printf("%d==%d\n",i,dp[i]);
        ans=max(dp[i],ans);
    }
    printf("%d",ans);
    return 0;
}

bfs

#include <iostream>
#include <queue>
using namespace std;
typedef pair<int,int>PII;
#define x first
#define y second
const int N=1e5+10;
int num[N];
int n,k,ans;
queue<PII>q;
void bfs(){
    q.push({0,0});

    while(!q.empty()){
        PII t=q.front();
        q.pop();
        int a=t.x,b=t.y;
        //printf("x==%d,y==%d\n",a,b);
        if((a+k)%n&&!num[(a+k)%n]){
            num[(a+k)%n]=b+1;
            q.push({(a+k)%n,b+1});
        }
        if((a+1)%n&&!num[(a+1)%n]){
            num[(a+1)%n]=b+1;
            q.push({(a+1)%n,b+1});
        }

    }
}
int main(){

    scanf("%d%d",&n,&k);
    bfs();
    for(int i=0;i<n;i++){
        ans=max(ans,num[i]);
    }
    printf("%d",ans);


    return 0;
}

标签:道题,int,31,printf,蓝桥,num,ans,include,dp
来源: https://blog.csdn.net/weixin_45627369/article/details/123595798