1.统计工龄
#include <bits/stdc++.h>
using namespace std;
//读入、输出 so easy
int main() {
int a[100005], n, x, ma = -1, i;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> x;
a[x]++;
ma = max(ma, x);
}
for (i = 0; i <= ma; i++)
{
if (a[i] != 0)
cout << i << ":" << a[i] << endl;
}
return 0;
}
2.寻找大富翁
#include <bits/stdc++.h>
using namespace std;
//读入、排序、输出
int main()
{
list<int> l;
int n, m, x;
cin >> n>>m;
while (n--)
{
cin >> x;
l.push_back(x);
}
l.sort();
l.reverse();
int i = 0;
list<int>::iterator it;
for (it = l.begin(); it != l.end(); it++)
{
if (i < m) {
if (i)
cout << " ";
cout << *it;
i++;
}
}
return 0;
}
3.点赞狂魔
#include <bits/stdc++.h>
using namespace std;
struct people
{
string name;
int len, num;
} a[105];
bool cmp(people a, people b)
{
if (a.num != b.num)
return a.num > b.num;
else
return a.len < b.len;
}
int main() {
int n, m, x;
cin >> n;
for (int i = 0; i < n; i++)
{//每个人都依次读入
set<int> st;//set去重
cin >> a[i].name >> a[i].len;
for (int j = 0; j < a[i].len; j++)
{
cin >> x;
st.insert(x);
}
a[i].num = st.size();
}
sort(a, a + n, cmp);
for (int i = 0; i < 3; i++)
{//遍历输出
if (i)
cout << " ";
if (i < n)
cout << a[i].name;
else
cout << "-";
}
return 0;
}
4.插入排序还是归并排序
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,x,k;
cin>>n;
int a[105],b[105];
for(int i=0;i<n;i++)cin>>a[i];//读入第一个序列
for(int i=0;i<n;i++)cin>>b[i];//读入第二个序列
int i,j;
//第一种情况:
//如果前面都是递增,后面的和第一个序列一样,那就是插入排序
for(i=0;i<n&&b[i]<=b[i+1];i++);
for(j=i+1;j<n&&b[j]==a[j];j++);
if(j==n)
{
cout << "Insertion Sort" << endl;
sort(a,a+i+2);
}
//否则就是归并排序
else
{
cout << "Merge Sort" << endl;
int k=1,flag=1;
while(flag)
{//排序直到和第二序列一样并且再排序一次
flag=0;
for(i=0;i<n;i++)
if(a[i]!=b[i])
flag=1;
k=k<<1;//左移 就是将二进制的每一个数都往左移动一位,高位舍去,低位补0
for(i=0;i<n/k;i++) sort(a+i*k,a+(i+1)*k);
sort(a+n/k*k,a+n);
}
}
for(i=0;i<n;i++)
{
if(i) cout << " ";
cout << a[i] ;
}
return 0;
}
5.逆序对
//和逆序对的数量一样
//归并排序及求逆序对
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int a[N] ,b[N];//b为辅助数组
long long int cnt=0;
void merge_sort(int l , int r)
{
if(r>l)//如果整个区间中元素个数大于1,则继续分割
{
int mid = (l+r) / 2 ;
int i = l; //辅助数组的下标
int p = l , q = mid+1;
merge_sort(l , mid);
merge_sort(mid+1 , r);
while(p<=mid||q<=r)//左右两部分只要有一部分不为空
{
if(q>r ||(p<=mid&&a[p]<=a[q])) b[i++] = a[p++];//从左半数组复制到辅助数组
else
{
b[i++] = a[q++];
cnt += mid -p +1;//将逆序对的个数累加起来
}
}
for(i = l ; i <= r; i++) a[i] = b[i];//将b中排好序的元素复制到a中
}
}
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n; i ++)cin >> a[i];
merge_sort(1 , n);
cout <<cnt<<endl;
return 0;
}
6.堆排序
#include<bits/stdc++.h>
using namespace std;
int a[10005],n;
//建议看看网课
void adjust(int s,int m) //筛选
{
int x=a[s];
for(int j=2*s;j<=m;j*=2)
{
if(j<m&&a[j]<a[j+1]) j++;
if(x<a[j])
{
a[s]=a[j];
s=j;
}
}
a[s]=x;
}
void creat()
{
for(int i=n/2;i>0;i--) adjust(i,n);
}
void heap_sort()
{
creat();
for(int i=n;i>1;i--)
{
swap(a[1],a[i]);
adjust(1,i-1);
//cout
for(int i=1;i<=n;i++)
{
if(i!=1) cout<<" ";
cout<<a[i];
}
cout<<endl;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)cin>>a[i];
heap_sort();
}
return 0;
}
7.快速排序
#include <bits/stdc++.h>
using namespace std;
int a[100005],n;
//建议看看网课
void quick_sort(int l,int r)
{
if(l<r)
{
int x=a[l],i=l,j=r;
while(i<j)
{
while(i<j&&a[j]>=x) j--;
a[i]=a[j];
while(i<j&&a[i]<=x) i++;
a[j]=a[i];
}
a[i]=x;
cout<<a[1];
for(int i=2;i<=n;i++) cout<<" "<<a[i];
cout<<endl;
quick_sort(l,i-1);//递归排序左半
quick_sort(i+1,r);//递归排序右半
}
}
int main() {
while(cin>>n)
{
for(int i=1;i<=n;i++) cin>>a[i];
quick_sort(1,n);
}
return 0;
}
8.归并排序
//题目没特殊要求直接排序输出
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
list<int> l;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
l.push_back(x);
}
l.sort();
list<int>::iterator it=l.begin();
for(;it!=l.end();it++)
{
cout<<*it<<" ";
}
return 0;
}
9.逆序对的数量
//归并排序及求逆序对
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int a[N] ,b[N];//b为辅助数组
long long int cnt=0;
void merge_sort(int l , int r)
{
if(r>l)//如果整个区间中元素个数大于1,则继续分割
{
int mid = (l+r) / 2 ;
int i = l; //辅助数组的下标
int p = l , q = mid+1;
merge_sort(l , mid);
merge_sort(mid+1 , r);
while(p<=mid||q<=r)//左右两部分只要有一部分不为空
{
if(q>r ||(p<=mid&&a[p]<=a[q])) b[i++] = a[p++];//从左半数组复制到辅助数组
else
{
b[i++] = a[q++];
cnt += mid -p +1;//将逆序对的个数累加起来
}
}
for(i = l ; i <= r; i++) a[i] = b[i];//将b中排好序的元素复制到a中
}
}
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n; i ++)cin >> a[i];
merge_sort(1 , n);
cout <<cnt<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
while (scanf("%d %d", &n, &k) != EOF)
{
int a[n] = {0};
for (int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
sort(a, a + n);
printf("%d\n",a[k-1]);
}
}
不懂得可以私信我,随时解答。
程序有错误请私信我,以及时改正。感谢!