牛客挑战赛34 赛后总结
总结
T1 背包|简单dp 在短时间内切了。 改进:需要认真审题,抓住题目的每一个细节。还可以适当提高做题速度qwq
T2 我是用打表找规律切的。 (虽然这样做有点无耻)改进:要加快自己总结规律的速度,要冷静分析规律。常用的规律有 2^n 这种。
比赛总结:
-
要沉稳一点,比赛的时候不要嘻嘻哈哈。
-
下一次 <牛客挑战赛> 争取做出三道题,或者在1h30min内切掉前两道题。
A
Code
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int N = 807;
int n,m,K,Y;
int a[N],p[N][N];
int f[N][N];
int main()
{
n = read(), m = read(), K = read(), Y = read();
for(int i=1;i<=n;++i) a[i] = read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
p[i][j] = read();
memset(f, 0x3f, sizeof(f));
f[0][0] = 0;
for(int i=1;i<=n;++i)
for(int j=0;j<=K;++j)
for(int l=0;l<=min(j,m);++l)
f[i][j] = min(f[i][j], f[i-1][j-l]+(l>=Y?p[i][l]:p[i][l]+a[i]*l));
printf("%d\n",f[n][K]);
return 0;
}
B
无耻打表
code
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
int n,k,lgn,lgk;
int main()
{
n = read(), k = read();
if(!(k&1)) {
puts("0 0"); return 0;
}
lgn = (int)(log2(n+1)), lgk = ceil((log2(k+1)));
int sum = lgn-lgk+1;
int mx = ((1<<(lgn))+k)>>1;
if(n-((1<<(lgn))-1) >= ((k+1)>>1))
++sum, mx = ((1<<(lgn+1))+k)>>1;
printf("%d %d\n",sum,mx);
return 0;
}
C
距离算法:切比雪夫距离和曼哈顿距离的转换题。套路题,改天学一下再补起来好了。
D
涉及数学知识点,改天补一下。