:加油加油,没几天就要比赛了

1.差分

差分的思想:给定a[1],a[2]…a[N],构造差分数组,使得a[i]=b[1]+b[2]+…b[i]
总的来说,a[i]就是b[1~i]的前缀和数组,那么构成a[i]的b[1],b[2]…b[i]就是差分数组.
其中b[i]=a[i]-a[i-1]
核心思想如果要对a[l~r]全部都+c,等价于b[l]+=c,b[r+1]-=c;

相当于:
1.a[1~l-1]无影响
2.a[l~r]加c
3.a[r+1~n]无影响

题目:
输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。

代码:

//差分 时间复杂度 o(m)
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main()
{int n, m;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);b[i] = a[i] - a[i - 1];      //构建差分数组}int l, r, c;while (m--){scanf("%d%d%d", &l, &r, &c);b[l] += c;     //将序列中[l, r]之间的每个数都加上cb[r + 1] -= c;}for (int i = 1; i <= n; i++){a[i] = b[i] + a[i-1];    //前缀和运算//或b[i]=b[i]+b[i-1];//就是将b[i]恢复成前缀和数组printf("%d ", a[i]);}return 0;
}

2.排序不等式

给定两个序列a,b,
同序相乘得最大:如果两个序列都是相同的排序顺序,即都从小到大或都从大到小,这样求得的结果是最大的
逆序相乘得最小:如果两个序列都是相反的排序顺序,即一个从小到大,一个从大到小,这样求得的结果是最小的

题目

思路:贪心算法:让最慢的人最后打水,即打水时间从小到大排序后就是最优的打水顺序
所以这个和排序不等式有什么关系呢?
我们可以让打水时间从小到大排列,然后每个人的等待时间正好就是从大到小排列的,相乘就是最优/小/少的打水顺序
代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+5;
int n;
int a[N];
int main() {cin >> n;for (int i = 0; i < n; ++i) cin >> a[i];    sort(a, a + n);    long long res = 0;      // WA后就知道开long long 了..    for (int i = 0; i < n; ++i) res += a[i] * (n - i - 1);//a[i]是第i个人的打水时间,n-i-1是第i个人到第n个人,//相乘就是第i个人到第n个人在此期间的所有花费的时间(第i个人的打水时间+其他人的等待时间)cout << res << endl;return 0;
}

3.差分+贪心+排序不等式

题目:

思路:
看到尽可能大这种,就想着要求最优解,然后看查询了好几次,那么查询次数最多的区间,肯定要分配更大的数字,才能满足题目的要求,然后落实到每个数上就是,查询越多次数的数字,这个数字要尽可能大,这就是贪心的思想;
那么如何才能得到查询的次数呢,有两种办法,一种就是暴力算出每个位置的查询次数,另一种就是用差分的思想,因为有区间l~r,所以想到了差分
那么最后如何得到结果总和呢,那就是每个位置查询的次数乘以该位置上的数字
如何才能使结果总和变大,应该就是利用排序不等式的思想,使得查询位置次数最多的乘以最大的数字,也就是两个数组(查询次数数组和数字数组)同序相乘再相加,就能使结果和变大;

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
const int N = 1e5 + 10;// long long 避免可能会爆 int 。
long long arr[N];
long long cnt[N]; // 一维差分,恢复后就是每个位置出现的次数。
int main()
{int n; cin >> n;for(int i = 1; i <= n; ++i){scanf("%d", &arr[i]);}int m; cin >> m;while (m -- ){int l, r;scanf("%d%d", &l, &r);cnt[l]++;//一维差分//目的:使得l~r的出现次数都增加1cnt[r + 1]--;//一维差分,使r+1~n出现次数保持不变}for(int i = 1; i <= n; ++i){cnt[i] += cnt[i - 1]; // 恢复成统计每个位置出现次数的数组(前缀和数组)}long long sumA = 0;for(int i = 1; i <= n; ++i){//结果总和=每个位置查询的次数乘以该位置上的数字sumA += cnt[i] * arr[i]; //原数组之和}/*因为较大的值 4 5 已经与 较大的次数 2 2 正好对应了。所以两个 数组全部排序,再遍历一遍,进行求和就性arr[]: 1 2 3 4 5cnt[]: 1 1 1 2 2*/long long sumB = 0;sort(arr + 1, arr + n + 1); sort(cnt + 1, cnt + n + 1);for(int i = 1; i <= n; ++i){sumB += cnt[i] * arr[i];//排序后数组之和}cout << sumB - sumA << endl;return 0;
}

4.贪心

贪心的思想主要是局部最优推全局最优
题目:

主要思想:
一个字符串恰好可以重复k次得到,说明字符串的长度%k应该是0,不为0说明无法修改成k次字符串,输出-1,然后我们通过字符串长度除以k就可以得到子字符串的长度,子字符串的个数就是k,我们依次比较每个子字符串在同位置上的字符,如果不一样就修改
但会出现几个问题,首先是不一样就修改,那谁是正确的?其次,要比较k次很麻烦,每个都得比较,复杂度高
故这里想到了贪心算法,求每个子字符串在同位置上的字符的出现个数,出现最多的就是正确的,那么其它的就是需要修改的,k-正确字符的个数就是修改的次数

代码:

#include <iostream>
#include <cstring>
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;
const int N = 1e6+100;
int arr[N],res[N],sum=0;
int j = 0;
string s;
string ss[N];
int cnt[N];
int ans=0;//修改次数
int main()
{int k;cin >> k;   cin >> s;int l = s.size();if (l % k != 0){cout << -1;}int m = l / k;//每个子列的长度//求子字符串for (int i = 0,t=0; i < l;)//i控制s,t控制次数,j控制ss的位置{if (t<m){ss[j]+= s[i];i++;t++;}else{t = 0;j++;}}/*
1.求子串的方法:for (int i = 0; i < s.size(); i=i+t) {string x = s.substr(i, t);//substr(起始位置,终止位置)v.push_back(x);}
2.此处可以不必求子串,直接遍历就好for (int i = 0; i < m; i++){for (int j = i; j < l; ){cnt[s[j] - 'a']++;j += m;}int ma = *max_element(cnt, cnt + 50);ans += k - ma;memset(cnt, 0, sizeof cnt);}
*/   for (int i = 0; i < m; i++){for (int t = 0; t <=j; t++){cnt[ss[t][i] - 'a']++;}int ma = *max_element(cnt,cnt+50);//求正确字符的出现次数ans += k - ma;//k-正确字符的个数就是修改的次数memset(cnt, 0, sizeof cnt);//fill(cnt, cnt + 26, 0);fill可以把初值设为任意值,memset只能设为0/-1}cout << ans;return 0;
}

5.其他小技巧

1.vector做二维动态dfs方便,也就是不知道数组大小,我们可以用vector来代替数组,因为vector是动态增加的;
2.map(key,value)在索引是非常方便;

差分+排序不等式+贪心相关推荐

  1. [排序不等式] 排队打水(排序不等式+贪心)

    文章目录 0. 前言 1. 排序不等式+贪心 0. 前言 经典的排序不等式问题,也是一个简单的小学数奥问题. 1. 排序不等式+贪心 913. 排队打水 贪心思路: 让最墨迹的人最后打水,即从小到大排 ...

  2. 【Acwing寒假2023每日一题】4655. 重新排序 - 差分 + 排序不等式

    4655. 重新排序 - AcWing题库 思路: 要让查询总和最大 也就是让查询区间交集部分的数最大 我们可以定义一个数组c记录每个位置被计算的次数 比如区间[1,3]和[2,5] 则c[1,2,2 ...

  3. [绝对值不等式] 货仓选址(绝对值不等式+贪心)

    文章目录 0. 前言 1. 排序不等式+贪心 0. 前言 最最最经典的绝对值不等式问题,有很多变种.这个题是最裸的模板题了. 1. 排序不等式+贪心 104. 货仓选址 贪心思路: 按照商店坐标从小到 ...

  4. 重新排序(差分,贪心,排序不等式)

    解题思路 Part 1:贪心 我们可以累计每个 AiAi 的被求和次数 cici.容易贪心得到,被求和次数越多的肯定得放越大的数(可用邻项交换证明)(排序不等式). 我们可以先统计原来的求和的总和 s ...

  5. 第六章贪心(三):排序不等式、绝对值不等式

    第六章贪心(三):排序不等式.绝对值不等式.推公式 AcWing 913:排队打水 题目 有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能 ...

  6. 第四十一章 贪心算法——排序不等式

    第四十一章 贪心算法--排序不等式 一.题目信息 二.排序不等式 1.算法内容 2.算法证明 3.思路分析 三.代码实现 一.题目信息 二.排序不等式 1.算法内容 2.算法证明 3.思路分析 这道题 ...

  7. 重新排序(排序不等式+差分)蓝桥

    重新排序 1.排序不等式 简单来说就是大的乘以大的,小的乘以小的,按顺序就可以排除最大的和 2.差分 由于题目涉及区间范围同时加上一个数,所以利用差分数组可以将复杂度降为O(n) 差分数组讲解 3.解 ...

  8. ACM - 贪心 - 基础(区间问题 + Huffman树 + 排序不等式 + 绝对值不等式 + 推公式)

    贪心 经典母题 1.区间问题 AcWing 905. 区间选点 AcWing 908. 最大不相交区间数量 AcWing 906. 区间分组 AcWing 907. 区间覆盖 2.Huffman树 A ...

  9. 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子

    耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...

最新文章

  1. sap scc4 客户端设置
  2. POJ 2696 计算表达式的值
  3. 前端学习(1928)vue之电商管理系统电商系统之美化一层循环的UI结构for循环ui美化
  4. 【课题总结】OpenCV 抠图项目实战(4)固定阈值抠图
  5. mapxtreme java manger web 应用程序牛刀小试
  6. Node.js ES6 模块化的基本语法-按需导出与按需导入
  7. 明白了一个重要的道理
  8. 所以,我们依然要读书
  9. Unity OnPostprocessTexture 和 OnPreprocessTexture 使用注意事项
  10. k8s启动Pod报错CrashLoopBackOff
  11. 动态面板数据模型及Eviews实现
  12. [Rscript]探索性因子分析
  13. php liger 表格排序,jQuery LigerUI 使用教程表格篇(1)
  14. 全国计算机网络英语,2007年10月自考试题计算机网络管理全国试卷(国外英语资料).doc...
  15. iOS 边学边记 升级ios14 Xcode真机调试启动非常慢的问题解决
  16. 黑白照片怎么上色?建议使用这几招
  17. 初试Cisco Packet Tracer--1——集线器
  18. java around_关于Aop切面中的@Before @Around等操作顺序的说明
  19. 机器学习 RBF神经网络
  20. 健身笔记(六)---健身四个月后总结

热门文章

  1. Redis 7.0 正式发布,新增近 50 个新命令,这次真的学不动了。。
  2. 田纳西大学计算机科学,田纳西大学电气工程与计算机科学
  3. 关于 SCJP 1.4 考试
  4. 数学黑洞(三)角谷猜想
  5. 基于矩阵分解的协同过滤推荐
  6. python中copy的使用
  7. 初识Rabbit消息队列
  8. 轮播图实现方法一——层叠轮播图
  9. 电池管理系统(BMS)-SOC算法
  10. uniapp背景色设置无效