题目大意:有 n n n个士兵,从 1 … n 1 \dots n 1…n编号,每个士兵拥有一个权值为 i i i。然后给定一个 0 − 1 0-1 0−1序列,表示每个士兵是否被标记。
现在要将这些士兵分为几组,同一组内如果存在比被标记的士兵权值更大的士兵,那么该士兵就会感觉到失望。要求最大化分组后各组失望士兵的权值和最大。
思路分析:要使得权值和最大,那么要让失望的士兵分布在尽可能多的组里。因此考虑两两配对。我们设置一个 c n t cnt cnt变量表示未被配对的士兵,并将所有士兵按照权值从大到小进行排序。遍历排之后的序列,如果当前的士兵被标记 c n t > 0 cnt > 0 cnt>0 ,且仍有未被配对的士兵,那么就进行配对。如果当前的士兵未被标记,那么直接加入等待配对的序列中。
由于我们已经按照权值从大到小进行排序过了,因此可以保证每次配对的士兵权值一定大于当前士兵的权值,也就是当前士兵一定会失望。
Accepted Code#include
#define int long long
using namespace std;
const int N = 1e6 + 10;
struct node{ bool st; int ser; }a[N];
inline void solve(){
int n = 0, cnt = 0, ans = 0; cin >> n;
string str; cin >> str; str = ' ' + str;
for(int i = n; i; i--){
if(str[i] == '1'){
if(cnt) cnt--, ans += i;
else cnt++;
}
else cnt++;
}
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?