b
include<bits/stdc++.h>
using namespace std;
/**
-
@brief 主函数,程序入口
-
@return int 返回值为0,表示程序正常结束
*/
int main()
{
// 输入数组长度n和天数d
int n, d;
cin >> n >> d;// 定义一个vector,用于存储输入数据
vector<pair<int, int>> a(n);// 输入数组a的元素
for (int i = 0; i < n; i++)
cin >> a[i].first >> a[i].second;// 遍历每一天
for (int m = 1; m <= d; m++)
{
// 初始化变量k,用于存储当前天的最大收益
int k = 0;// 遍历数组afor (const auto& pair : a) {// 获取当前元素的两个值int t = pair.first;int l = pair.second;// 计算当前元素在当前天的收益,并更新最大收益k = max(k, t * (l + m));}// 输出当前天的最大收益cout << k << endl;
}
// 返回0,表示程序正常结束
return 0;
}
c
include<bits/stdc++.h>
using namespace std;
using ll=long long;
/**
-
@brief 主函数,程序入口
-
@return int 返回值为0,表示程序正常结束
*/
int main()
{
// 输入数组长度n
int n;
cin>>n;// 定义数组a,用于存储输入数据
int a[n+1];// 输入数组a的元素
for(int i=1;i<=n;i++)
cin>>a[i];// 初始化左右指针l和r
int l=1,r=1;// 初始化结果变量res
ll res=0;// 遍历数组a
while(l<=n)
{
// 移动右指针r,直到找到第一个不满足条件的元素
while(r<=n&&a[r]<a[l]*2) r++;// 计算以当前左指针l为起点的满足条件的子数组数量res+=n-r+1;// 移动左指针ll++;
}
// 输出结果
cout<<res<<endl;// 返回0,表示程序正常结束
return 0;
}
d
include<bits/stdc++.h>
using namespace std;
/**
-
@brief 主函数,程序入口
-
@return int 返回值为0,表示程序正常结束
*/
int main()
{
// 输入数组长度n
int n;
cin>>n;// 定义两个数组a和b,用于存储输入数据和辅助计算
vectora(n+1),b(n+1); // 输入数组a的元素
for(int i=1;i<=n;i++)
cin>>a[i];// 初始化变量k,用于累加数组b的元素
int k=0;// 遍历数组a
for(int i=1;i<=n;i++)
{
// 累加数组b的元素
k+=b[i];
// 更新数组a的元素
a[i]+=k;
// 计算当前元素可以向前移动的最大步数
int m=min(a[i],n-i);
// 更新数组a的元素
a[i]-=m;
// 更新数组b的元素
b[i+1]++;
b[i+m+1]--;
// 输出数组a的当前元素
cout<<a[i]<<" ";
}// 返回0,表示程序正常结束
return 0;
}
e
include<bits/stdc++.h>
using namespace std;
// 定义数组a和b,用于存储输入数据
int a[1000005],b[1000005];
// 定义变量n,用于存储数组长度
int n;
/**
- @brief 检查是否存在长度为x的子数组满足条件
- @param x 子数组的长度
- @return true 如果存在满足条件的子数组
- @return false 如果不存在满足条件的子数组
/
bool check(int x)
{
// 遍历前x个元素
for(int i=1;i<=x;i++)
{
// 如果当前元素的两倍大于对应的后x个元素,则返回false
if(a[i]2>a[n-x+i]) return false;
}
// 如果所有元素都满足条件,则返回true
return true;
}
/**
- @brief 主函数,程序入口
- @return int 返回值为0,表示程序正常结束
*/
int main()
{
// 输入数组长度n
cin>>n;
// 输入数组a的元素
for(int i=1;i<=n;i++) cin>>a[i];
// 对数组a进行排序
sort(a+1,a+n+1);
// 初始化二分查找的左右边界
int l=0,r=n/2;
// 二分查找
while(l<r)
{
// 计算中间值
int mid=l+r+1>>1;
// 如果中间值满足条件,则更新左边界
if(check(mid)) l=mid;
// 否则更新右边界
else r=mid-1;
}
// 输出结果
cout<<l<<endl;
// 返回0,表示程序正常结束
return 0;
}