20240317
A. 卖牛奶
简单题目,枚举每一天然后依次求和即可,注意数据范围,需要开long long。
#include<bits/stdc++.h>
using namespace std;
long long a[1000000],b[1000000],n,ans;
int main()
{
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=n; i++) cin>>b[i];
long long sa = 0, sb = 0;
for (int x = 1; x <= n; ++x)
{
sa += a[x];
sb += b[x];
if (sa < sb)
{
cout<<x;
return 0;
}
}
return 0;
}
B. 禁止超载
实际上是在求满足 1+2+3+...+i <= n 的最大i值,循环求和即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long ans=0;
for(int i=1;;i++)
{
if(ans+i>n) break;
ans+=i;
cout<<i<<' ';
}
return 0;
}
C. 最短时间
以从A到C为例,有两条路,第一条是直接从A到C,第二条是先从A到B,再从B到C。因此,只需要将这两条路的距离求min。注意区分x,y,z的含义,不要写错顺序。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,y,z;
cin>>x>>y>>z;
cout<<min(x,y+z)<<endl<<min(y,x+z)<<endl<<min(z,x+y);
return 0;
}
D. 元数据
该系统中共有n个文件,已知n≤10^6,编号在1~n之间,故可以建一个数组a,a[i]表示i号文件此时的大小。
对于两种操作,由于我们只需要知道文件大小,不需要知道文件内容,所以在文件开头或者末尾操作是没有区别的。如果是删除,就只需要将a[x]-=y;如果是添加,就只需要将a[x]+=y。
注意:如果某个操作使得文件大小超出了这个区间,则未超出部分正常执行,超出部分直接忽略。也就是说,做减法时我们需要保证a[x]最小不能低于 0,做加法时最大不能超过10^9,使用if判断即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
ll a[1000010];
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int opt, x;
ll y;
scanf("%d%d%lld",&opt,&x,&y);
if(opt==1)
{
a[x]-=y;
if(a[x]<0) a[x]=0;
}
else
{
a[x]+=y;
if(a[x]>1000000000) a[x]=1000000000;
}
}
for(int i=1;i<=n;i++) printf("%lld\n",a[i]);
return 0;
}
E. 拔萝卜
数据范围很小,可以考虑最暴力的做法:枚举每个小矩形,再枚举矩形中的每个元素并求和,判断萝卜数量有没有超过k个,如果>=k则计算矩形大小,比ans小就更新答案。
如果想要进行一些优化,可以使用二维前缀和的方法,将枚举矩形中的每个元素这个步骤O(1)计算出来,可以将6重for降为4重。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,z,ans=99999999;
cin>>n>>m>>z;
int a[100][100];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) // i 和 j 枚举左上角
for (int x = i; x <= n; ++x) // x>=i 所以从 i 开始枚举
for (int y = j; y <= m; ++y) // x 和 y 枚举右下角
{
int sum = 0; // sum 表示当前矩形区域的和
for (int p = i; p <= x; ++p)
for (int q = j; q <= y; ++q)
sum += a[p][q];
if (sum >= z)
ans = min(ans, (x - i + 1) * (y - j + 1));
}
if(ans==99999999) cout<<-1;
else cout<<ans;
return 0;
}