4087. 插入排序
第一种暴力,过13/25用例
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
/*1 x v : 这是第一种操作,会将 a的第 x个元素,也就是 ax的值,修改为 v.保证 1≤x≤n,1≤v≤109
注意这种操作会改变数组的元素,修改得到的数组会被保留也会影响后续的操作。
2 x : 这是第二种操作,假设 H老师按照上面的伪代码对 a数组进行排序,你需要告诉 H老师原来 a
的第 x个元素,也就是 ax,在排序后的新数组所处的位置。保证 1≤x≤n.
注意这种操作不会改变数组的元素,排序后的数组不会被保留,也不会影响后续的操作。*/
class s{
public:
int a;
int id;
};
bool printafter(const s s1,const s s2){
if(s1.a!=s2.a)return s1.a<s2.a;
return s1.id<s2.id;
}
int main(){
cin>>n>>m;
s b[300010];
int op[300010];
for(int i=1;i<=n;i++){
int x;
cin>>x;
b[i].a=x;
b[i].id=i;
}
sort(b+1,b+1+n,printafter);
for(int i=1;i<=n;i++){
op[b[i].id]=i;
}
for(int j=1;j<=m;j++){
int c;
cin>>c;
if(c==1){
int x1,x2;
cin>>x1>>x2;
int xx=b[op[x1]].a;
b[op[x1]].a=x2;
int yy=op[x1];
if(xx>x2){
sort(b+1,b+1+yy,printafter);
for(int f=1;f<=yy;f++){
op[b[f].id]=f;
}
}
if(xx<x2){
sort(b+yy,b+1+n,printafter);
for(int f=yy;f<=n;f++){
op[b[f].id]=f;
}
}
}
if(c==2){
int x1;
cin>>x1;
cout<<op[x1]<<endl;
}
}
return 0;
}
第二种,对排序进行了优化,ac
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
/*1 x v : 这是第一种操作,会将 a的第 x个元素,也就是 ax的值,修改为 v.保证 1≤x≤n,1≤v≤109
注意这种操作会改变数组的元素,修改得到的数组会被保留也会影响后续的操作。
2 x : 这是第二种操作,假设 H老师按照上面的伪代码对 a数组进行排序,你需要告诉 H老师原来 a
的第 x个元素,也就是 ax,在排序后的新数组所处的位置。保证 1≤x≤n.
注意这种操作不会改变数组的元素,排序后的数组不会被保留,也不会影响后续的操作。*/
class s{
public:
int a;
int id;
};
bool printafter(const s s1,const s s2){
if(s1.a!=s2.a)return s1.a<s2.a;
return s1.id<s2.id;
}
int main(){
cin>>n>>m;
s b[300010];
int op[300010];
for(int i=1;i<=n;i++){
int x;
cin>>x;
b[i].a=x;
b[i].id=i;
}
sort(b+1,b+1+n,printafter);
for(int i=1;i<=n;i++){
op[b[i].id]=i;
}
for(int j=1;j<=m;j++){
int c;
cin>>c;
if(c==1){
int x1,x2;
cin>>x1>>x2;
int xx=b[op[x1]].a;
b[op[x1]].a=x2;
int yy=op[x1];
if(xx>x2){
for(int f = op[x1];f > 1;f--)
{
if((b[f].a== b[f - 1].a && b[f - 1].id < b[f].id)
|| (b[f].a > b[f - 1].a))
break;
swap(b[f], b[f - 1]);
op[b[f].id] = f;
}
}
if(xx<x2){
for(int f = op[x1];f < n;f++)
{
if(b[f + 1].a == b[f].a && b[f + 1].id > b[f].id)
break;
if(b[f + 1].a > b[f].a)
break;
swap(b[f], b[f + 1]);
op[b[f].id] = f;
}
}
for(int f = 1;f <= n;f++)
{
op[b[f].id] = f;
}
}
if(c==2){
int x1;
cin>>x1;
cout<<op[x1]<<endl;
}
}
return 0;
}
5332. 选择排序
#include <iostream>
#include <vector>
using namespace std;
int n;
void selectionSort(vector<int>& arr) {
for (int i = 0; i < n - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[min_idx]) {
min_idx = j;
}
}
swap(arr[i], arr[min_idx]);
}
}
int main() {
vector<int> arr;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
arr.push_back(x);
}
selectionSort(arr);
for (int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
5334. 冒泡排序
#include <iostream>
#include <vector>
using namespace std;
int n;
void bubbleSort(vector<int>& arr) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
int main() {
vector<int> arr;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
arr.push_back(x);
}
bubbleSort(arr);
for (int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
4653. 数位排序
暴力,1/2用例
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int n,m;
bool compare(const int a,const int b){
int a1=0,b1=0;
int aa=a,bb=b;
while(aa){
a1+=aa%10;
aa/=10;
}
while(bb){
b1+=bb%10;
bb/=10;
}
if(a1!=b1) return a1<b1;
return a<b;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
a.push_back(i);
}
/*for(auto i:a) cout<<i;
cout<<endl;*/
sort(a.begin(),a.end(),compare);
/*for(auto i:a) cout<<i<<" ";
cout<<endl;*/
cout<<a[m-1];
return 0;
}
预先处理位数:先预处理时间复杂度O(nlogn)。不先预处理排序花费的时间复杂度为O(nlogn)里面嵌套求n个数的数位和O(n),总时间复杂度为O(n*nlogn)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node {
int x,y;
}a[1000010];
bool compare(node a,node b){
if(a.y!=b.y)return a.y<b.y;
return a.x<b.x;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].x=i;
int t=i;
while(t){
a[i].y+=t%10;
t/=10;
}
}
sort(a+1,a+1+n,compare);
cout<<a[m].x;
return 0;
}
862. 三元组排序
#include<bits/stdc++.h>
using namespace std;
class s{
public:
int x;
string y;
string z;
};
int n;
bool cmp(s s1,s s2){
return s1.x<s2.x;
}
int main(){
int n;
cin>>n;
int xx;string yy;string zz;
vector<s>a;
for(int i=0;i<n;i++){
cin>>xx>>yy>>zz;
s s1;
s1.x=xx;
s1.y=yy;
s1.z=zz;
a.push_back(s1);
}
sort(a.begin(),a.end(),cmp);
for(auto i:a) cout<<i.x<<" "<<i.y<<" "<<i.z<<endl;
return 0;
}
5333. 插入排序
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1001];
void insertSort(int a[1001]){
for (int i = 1; i < n; i++){
for(int j=i;j>0;j--){
if(a[j]<a[j-1]){
swap(a[j],a[j-1]);
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[i]=x;
}
insertSort(a);
for(int i=0;i<n;i++) cout<<a[i]<<" ";
return 0;
}
3213. 数字排序
给定 n𝑛 个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
#include<bits/stdc++.h>
using namespace std;
class s{
public:
int num;
int id;
};
bool cmp(s s1,s s2){
if(s1.num!=s2.num) return s1.num>s2.num;
return s1.id<s2.id;
}
int main(){
int n;
cin>>n;
s stu[1001];
for(int i=0;i<1001;i++){
stu[i].id=i;
stu[i].num=0;
}
for(int i=0;i<n;i++){
int x;
cin>>x;
stu[x].num++;
}
sort(stu,stu+1001,cmp);
for(int i=0;i<1001;i++){
if(stu[i].num!=0){
cout<<stu[i].id<<" "<<stu[i].num<<endl;
}
}
return 0;
}
1579. 插入还是归并
只过了6/12
429. 奖学金
#include<bits/stdc++.h>
using namespace std;
int n;
class s{
public:
int c;
int m;
int e;
int sum;
int id;
};
bool cmp(s s1,s s2){
if(s1.sum!=s2.sum) return s1.sum>s2.sum;
else if(s1.c!=s2.c)return s1.c>s2.c;
else return s1.id<s2.id;
}
int main(){
cin>>n;
vector<s>stu;
int cc;int mm;int ee;
for(int i=0;i<n;i++){
s ss;
cin>>cc>>mm>>ee;
int su=0;
su=cc+mm+ee;
ss.c=cc;
ss.m=mm;
ss.e=ee;
ss.id=i+1;
ss.sum=su;
stu.push_back(ss);
}
sort(stu.begin(),stu.end(),cmp);
for(int i=0;i<5;i++){
cout<<stu[i].id<<" "<<stu[i].sum<<endl;
}
return 0;
}