我的思路
把竖式排序,然后变成差分数组,用第一项来表示全部项;
自己没做过的做法,很难写对,正确性都没有成功验证,还得积累解题套路
思路
// 不是让数组保持原状竖着排序,顺时针转90度,n,m交换,然后再一行一行排序
// 列出表达式 s = |3-1| + |7-1| + |7-3|,绝对值的式子的处理,只要能把元素交换成大减小就可以忽略绝对值了。
// 把加的和减的拿出来看,加的个数从小到大是0,1,2,减的是2,1,0;
//
涉及的套路
1.数组旋转:
用途:目前见过 除了题目明确要求进行这个操作外,用于数组的纵向排序
向右旋转90度:
cin时ij倒转
for(int i= 0;i < n;i++){ for(int j = 0;j < m;j++){ cin >> f[j][i]; }
后续操作时n,m调换位置
将纵列换成横行后进行排序 for(int i = 0;i < m;i++) sort(f[i],f[i]+n);
for(int i = 0;i < m;i++){ for(int j= 0;j < n;j++){ cout << f[i][j]; } }
2.二维vector的初始化与使用
定义:
vector<vector<int> > f(n,vector<int> (m)); 等价于 f[n][m];
好处在于,n,m在vector中可以为变量。
对于某些题给范围时给的是
n*m <= 5e5,
就不能用二维数组,只能用vector了
还有通过push_back()实现动态扩容
注意vector访问时下标从0开始
输入元素:
通过上面的定义方式定义后,可以直接通过下标来输入,使用方法同普通数组 for(int i = 0;i < n;i++){ for(int j= 0;j < m;j++){ cin >> f[i][j]; } } 如果只是 vector<vector<int> > f; 这样的定义,没有提前开辟内存的话 输入时要用pushback() for(int i = 0;i < n;i++){ for(int j= 0;j < m;j++){ int x; cin >> x; f[i].pushback(x); } }