ACM非常的基础数据结构和算法

快要考试了,帮Kiwinnn整理一些很基础的数据结构和算法。

一、pair

有时需要定义含有两个元素的结构体,但是又懒得定义结构体怎么办?可以使用pair这个结构

定义方式pair<类型1,类型2>名字,如pair<string,int>p;

可以使用p.first和p.second访问两个元素。

#include <bits/stdc++.h>
using namespace std;
pair<string,int>p[100];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>p[i].first>>p[i].second;
        }
        for(int i=0;i<n;i++)
        {
            cout<<p[i].first<<' '<<p[i].second<<endl;
        }
    }
    return 0;
}

运行结果:

sort排序时,默认按照第一个元素排序

#include <bits/stdc++.h>
using namespace std;
pair<string,int>p[100];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>p[i].first>>p[i].second;
        }
        sort(p,p+n);
        for(int i=0;i<n;i++)
        {
            cout<<p[i].first<<' '<<p[i].second<<endl;
        }
    }
    return 0;
}

二、sort

听说还有很多冒泡人……sort采用了快速排序算法,复杂度O(logn)

使用方法

sort(排序开始元素指针,排序结束元素指针,自定义排序方式)

比如对一个数组从小到大排序(不添加自定义排序方式,默认从小到大)

#include <bits/stdc++.h>
using namespace std;
int a[100];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

这里是对下标0~9的元素排序

所以是sort(a+0,a+9+1);

如果对下标index1~index2的元素排序

sort(a+index1,a+index2+1);

那数组换成vector呢?

#include <bits/stdc++.h>
using namespace std;
vector<int>v;
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            int num;
            cin>>num;
            v.push_back(num);
        }
        sort(v.begin(),v.end());
        for(int i=0;i<n;i++)
        {
            cout<<v[i]<<' ';
        }
        cout<<endl;
    }
    return 0;
}


 如果加上自定义函数呢

举个栗子!对元素从大到小排序

#include <bits/stdc++.h>
using namespace std;
int a[100];
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        sort(a,a+n,cmp);
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

如果类型换成自定义的结构体呢?

注意,如果是自定义的结构体,用sort排序一定要添加比较函数

#include <bits/stdc++.h>
using namespace std;
struct Point
{
    int x,y;
}p[100];
bool cmp(Point p1,Point p2)
{
    if(p1.x==p2.x)//如果两个点x相同,按照y从小到大排序
        return p1.y<p2.y;
    return p1.x<p2.x;//按照x从小到大排序
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>p[i].x>>p[i].y;
        }
        sort(p,p+n,cmp);
        cout<<"*********"<<endl;
        for(int i=0;i<n;i++)
        {
            cout<<p[i].x<<' '<<p[i].y<<endl;
        }
    }
    return 0;
}

先按照x从小到大排序,如果x相同,按照y从小到大排序

三、常用取整函数

1.floor()(翻译:地板)向下取整,找到一个最大的比该数小的整数

2.ceil()(翻译:天花板)向上取整,找到一个最小的比该数大的整数

3.round()(翻译:XXX)四舍五入取整

#include <bits/stdc++.h>
using namespace std;

int main()
{
    cout<<floor(3.6)<<endl;
    cout<<ceil(3.6)<<endl;
    cout<<round(3.6)<<endl;
    cout<<round(3.4)<<endl;
    return 0;
}

四、关同步

C++的cin和cout比scanf和printf慢

有时候有些题会卡这个时间,既想节省时间,又想用cin、cout该咋办呢

可以在main函数中加入语句,关掉同步。关同步后,程序里不能出现scanf和printf

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    
    return 0;
}

五、万能头文件

有时候使用某个函数或类型需要定义头文件,想不起来怎么办?

使用万能头文件,这个头文件内含所有头文件,定义一个,幸福一生

#include <bits/stdc++.h>
using namespace std;

int main()
{
    
    
    return 0;
}

发布了40 篇原创文章 · 获赞 7 · 访问量 1万+
展开阅读全文

求dalao看看这道山东理工acm 数据结构实验之栈:行编辑器 这道题

03-15

数据结构实验之栈:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效; 如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符"@",以表示当前行中的字符均无效。 如果已经在行首继续输入'#'符号无效。 Input 输入多行字符序列,行字符总数(包含退格符和退行符)不大于250。 Output 按照上述说明得到的输出。 Example Input whli##ilr#e(s#*s) outcha@putchar(*s=#++); Example Output while(*s) putchar(*s++); ************ ************ ************ ************ 我这个运行后 有一组样例 huhu##hs hu huhs huhs ************ ************ ************ ************ 我怀疑是s2没清理干净 残留了“hs” 但是我开头又清空了栈 我很难受 #include<iostream> #include<stack> #include<vector> #include <string> using namespace std; int main() { int k = 0,n = 0,m; string c; stack<char> s1,s2; //s1 用户输入原始数据 s2 处理后的数据 while(cin >> c) { while(!s1.empty()) s1.pop(); while(!s2.empty()) s2.pop(); k = 0; //k 是纪录##的个数 n = 0; //n 是纪录s1中的char个数 m = 0; //m 是纪录s2中的char个数 for(int i = 0;i<sizeof(c);++i) { s1.push(c[i]); n++; } while (n -- ) { if(s1.top() == '#') { k++; s1.pop(); } else if(s1.top() == '@') { break; } else { if(k == 0) { s2.push(s1.top()); s1.pop(); m++; } else { s1.pop(); k--; } } } while(!s2.empty()) { cout << s2.top(); s2.pop(); } cout << endl; } } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览