贪心
#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; }
经典动规
#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; }
手表可调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; }