《冬训周报三》
关于C++中ios::sync_with_stdio(false);
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函数
参数
功能
假设定义一个结构体:
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度