《冬训周报三》

关于C++中ios::sync_with_stdio(false);

 在C++中的输入和输出有两种方式,一种是scanf和printf,另一种是cin和cout,在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的。

C++和C很相似,但是在后面的一种方式中cin和cout的输入和输出效率比第一种低,而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。

关于cin.tie(0)和cout.tie(0)

tie

tie是将两个stream绑定的函数,空参数的话返回当前的输出流指针。


在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率

ACM应用

在ACM里,经常出现数据集超大造成 cin TLE的情况。这时候大部分人认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf之类。

在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

 

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

// std::ios::sync_with_stdio(false);
// std::cin.tie(0),cout.tie(0); 

原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段代码可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几.

 

结构体排序

当时觉得应该能写出来的,但是好像写错了


顺便补上一道题 好想听肆宝唱歌啊

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef struct sing{
    int w;
    string s;
};
bool cmp(sing a,sing b)
{
    return a.w > b.w;
}
int main()
{
    int n;
    cin >> n;
    sing str[1000020];
    for(int i=0;i<n;i++)
     cin >> str[i].w >> str[i].s;
     int k;
    cin >> k;
    sort(str,str+n,cmp);
    cout << str[k].s << endl;
    return 0;
}

(其实就是再写cmp函数,可能是我对sort还不太熟悉)

 

关于sort函数

参数

(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
 

功能

sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。
一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即排序方法的选择。
 
为什么要用c++标准库里的排序函数?
 
sort()函数是c++一种排序方法之一,相较冒泡排序和选择排序所带来的执行效率不高的问题,sort()函数使用的排序方法是类似于快速排序的方法,时间复杂度为n*log2(n),执行效率较高。
 

假设定义一个结构体:

struct node
{    
int a;    
int b;    
double c;
}

有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写一个比较函数:

bool cmp(node x,node y)
{    
if(x.a!=y.a) return x.a<y.a;    
if(x.b!=y.b) return x.b>y.b;    
return x.c>y.c;
}

 

月光奏鸣曲

题解

处理出第一个正方形0,90,280,270度时的样子,然后将第二个正方形进行比较,最小旋转次数即可,如果都不能匹配,则输出-1;

当时也是这么想的,不过没想出来怎么写旋转

 (记录一下正二维的旋转怎么写)

关键代码

bool check0() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (b[i][j] != a[i][j]) return false;
        }
    }
    return true;
}//判断0度

bool check1() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (b[i][j] != a[n - j + 1][i]) return false;
        }
    }
    return true;
}//判断90度

bool check2() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (b[i][j] != a[j][n - i + 1]) return false;
        }
    }
    return true;
}//判断180度

bool check3() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (b[i][j] != a[n - i + 1][n - j + 1]) return false;
        }
    }
    return true;
}//判断270度

 

posted @ 2023-01-22 19:00  Ke_scholar  阅读(20)  评论(0编辑  收藏  举报