网易C++后台开发笔试编程题
通过: 100 0 100 100
第一题,水题,直接在牛客上写的,没保存代码
第二题,一眼题,实在不知道自己哪里写错了,用了各种方法都不行。思路:只要堆高度为 0 1 2 3 4 5 ....就行
第三题, 尺取法,前缀法维护下
typedef long long LL;
using namespace std;
int T;
int n;
int a[MAXN];
LL sum[MAXN];
int main()
{
scanf("%d", &T);
while(T--)
{
memset(sum, 0, sizeof(sum));
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", a+i);
sum[i] = sum[i-1]+a[i];
}
if(n == 1)
{
puts("1");
continue;
}
int ans = 1;
int cur = 1;
for(int i=1; i<=n; i++)
{
while(cur <= n && a[cur] >= sum[cur-1] - sum[i-1])
{
ans = max(ans, cur-i+1);
cur++;
}
if(cur > n)
break;
}
printf("%d\n", ans);
}
return 0;
} 第四题, dp dp[i][j] 表示前 i 个数生成 j 的最小代价
typedef long long LL;
using namespace std;
int n, b;
int a[1007];
int dp[1007][1007];
vector<int> fac;
map<int, int> mp;
int main()
{
scanf("%d%d", &n, &b);
for(int i=0; i<n; i++)
scanf("%d", a+i);
for(int i=1; i*i<=b; i++)
{
if(b%i == 0)
{
if(i != b/i)
{
fac.push_back(i);
fac.push_back(b/i);
}
else
fac.push_back(i);
}
}
sort(fac.begin(), fac.end());
int tot = fac.size();
for(int i=0; i<tot; i++)
dp[1][i] = abs(fac[i] - a[0]);
for(int i=2; i<=n; i++)
{
for(int j=0; j<tot; j++)
{
dp[i][j] = 0x7fffffff;
for(int k=0; k<=j; k++)
{
if(fac[j] % fac[k] == 0)
{
dp[i][j] = min(dp[i][j], dp[i-1][k] + abs(a[i-1] - fac[j]/fac[k] ));
}
}
}
}
printf("%d\n", dp[n][tot-1]);
return 0;
}
美团公司氛围 2941人发布
查看20道真题和解析