蓝桥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-k1])
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