[贪心] aw3769. 移动石子(模拟)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[贪心] aw3769. 移动石子(模拟)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:3769. 移动石子
2. 题目解析
贪心即可。
从左到右往第一个盒子走就行了,盒子下标从 0 开始,第 i
个盒子的一个石头走到第 0 个盒子需要操作 i
次。d/i
就是能操作过去的石头数量:
- 如果
a[i]<=d/i
说明当前第i
个盒子中的石头能全部移动到第一个盒子中。 - 如果
a[i]>d/i
即第i
个盒子中的石头只有d/i
个石头能移动到第一个盒子中。
也可以不用存,直接边读入边计算即可。但是一定要注意:多组测试数据不要break,后面的还没读完。
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
模拟
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, d;
int a[N];
int main() {
int T; cin >> T; while (T -- ) {
cin >> n >> d;
for (int i = 0; i < n; i ++ ) cin >> a[i];
int res = a[0];
for (int i = 1; i < n; i ++ ) {
int t = a[i] * i;
if (d >= t) res += a[i], d -= t;
else {
res += d / i;
break;
}
}
cout << res << endl;
}
return 0;
}
y总的简洁风:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin >> T;
while (T -- )
{
int n, d;
cin >> n >> d;
int res = 0;
for (int i = 0; i < n; i ++ )
{
int x;
cin >> x;
if (!i) res += x;
else
{
int t = min(x, d / i); // 不足的 d/i=0 就不用特判了
res += t;
d -= t * i;
}
}
cout << res << endl;
}
return 0;
}
经典错误:多组测试数据不要break,后面的还没读完。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,res,x;
cin>>n>>m>>res;
for(int i=1;i<n;++i)
{
cin>>x;
/*int t=min(x,m/i);
res+=t;
m-=t*i;*/
while(i*x>m)x--;
res+=x;
m-=x*i;
if(m<=0)break;
}
cout<<res<<endl;
}
return 0;
}
以上是关于[贪心] aw3769. 移动石子(模拟)的主要内容,如果未能解决你的问题,请参考以下文章
[模拟] aw3771. 选取石子(脑筋急转弯+aw周赛008_2)
[贪心] aw3705. 子集mex值(贪心+模拟+模板题)