【暑期实训】Week 1
实训第一周结束了,感受是,真的挺快乐的,虽然每天要从工部到信部竖穿整个学校,但是时间没有感觉到996很痛苦,大部分时候就是写题,而且题也基本上是8易2中这样的难度分布。
Day 1、2 教了一些Linux和Git的基本操作,是以前没怎么接触到的部分,不过上手还是挺容易的,只要记住几个核心操作完全能达到要求。给我比较难受的是只能用C不能用C++,先开始不太了解C的库函数,甚至不知道qsort,strcmp,strcpy,真的是被C++惯坏了。
Day 3、4 讲的是代码风格和Debug,见识了一些新的Debug手法但是并没有学会,还是老oi人那一套用着舒服。
Day 5、6 开始涉及算法和数据结构,但是也都是无比基础的栈,队列,链表和贪心。
我个人的学习节奏就是,写题为主,写完了必做题过后就做了做挑战题和选做题,基本上也写完了,真的梦回高中,还挺让人怀念的。
然后写一点收获吧!包括以前涉及过但是遗忘了的和新学的一些知识点
C语言结构体排序
struct Node { int l,r; } a[N]; int ans=0,cnt=0; int cmp(void *a,void *b) { struct Node c=*(struct Node*)a; struct Node d=*(struct Node*)b; if(c.r!=d.r)return c.r-d.r; else return d.l-c.l; }
必须把a和b是void,然后再前缀转换,最后用qsort
qsort(a+1,n,sizeof(a[0]),cmp);
qsort(数组+起始地址,长度,最小单位,比较函数)
常数优化
OIer的祖传代码了
#pragma GCC optimize(3) #pragma GCC target("avx") #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #pragma GCC optimize("-fgcse") #pragma GCC optimize("-fgcse-lm") #pragma GCC optimize("-fipa-sra") #pragma GCC optimize("-ftree-pre") #pragma GCC optimize("-ftree-vrp") #pragma GCC optimize("-fpeephole2") #pragma GCC optimize("-ffast-math") #pragma GCC optimize("-fsched-spec") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("-falign-jumps") #pragma GCC optimize("-falign-loops") #pragma GCC optimize("-falign-labels") #pragma GCC optimize("-fdevirtualize") #pragma GCC optimize("-fcaller-saves") #pragma GCC optimize("-fcrossjumping") #pragma GCC optimize("-fthread-jumps") #pragma GCC optimize("-funroll-loops") #pragma GCC optimize("-fwhole-program") #pragma GCC optimize("-freorder-blocks") #pragma GCC optimize("-fschedule-insns") #pragma GCC optimize("inline-functions") #pragma GCC optimize("-ftree-tail-merge") #pragma GCC optimize("-fschedule-insns2") #pragma GCC optimize("-fstrict-aliasing") #pragma GCC optimize("-fstrict-overflow") #pragma GCC optimize("-falign-functions") #pragma GCC optimize("-fcse-skip-blocks") #pragma GCC optimize("-fcse-follow-jumps") #pragma GCC optimize("-fsched-interblock") #pragma GCC optimize("-fpartial-inlining") #pragma GCC optimize("no-stack-protector") #pragma GCC optimize("-freorder-functions") #pragma GCC optimize("-findirect-inlining") #pragma GCC optimize("-fhoist-adjacent-loads") #pragma GCC optimize("-frerun-cse-after-loop") #pragma GCC optimize("inline-small-functions") #pragma GCC optimize("-finline-small-functions") #pragma GCC optimize("-ftree-switch-conversion") #pragma GCC optimize("-foptimize-sibling-calls") #pragma GCC optimize("-fexpensive-optimizations") #pragma GCC optimize("-funsafe-loop-optimizations") #pragma GCC optimize("inline-functions-called-once") #pragma GCC optimize("-fdelete-null-pointer-checks")
部分题解
格式化程序
这个题的思路其实很简单,一共只有五种情况
(1)/
(2)\
(3).
(4)..
(5)字符串
对于(1)(2)可合并为同一种,直接跳过 (3)直接跳过 (4)将栈顶字符串出栈 (5)进栈
一些细节:1、需要判断是否以/开头 2、需要判断是否Value Error
实现和数据都没什么坑,需要注意一下打印格式。最后倒着打印栈即可
#include<stdio.h> #include<string.h> #include<stdlib.h> char s[110]; int n,top; char o; struct email { char w[120]; }q[1210]; int main() { while (scanf("%s", s) != EOF) { int len = strlen(s),print=0; int st = 0,i=0,ed=0; if (s[0] == '/' || s[0] == 92) st = 1; top=0; s[len] = ' '; while(i<len) { if (s[i] == '.') { if (s[i + 1] != '.') { i++; continue;//一个点 } if (top==0) { print=1; puts("Value Error"); ed=1; break; } else top--; i++; continue; } if (s[i] == '/' || s[i] == 92) { i++; continue; } int j = 0; char temp[101]; memset(temp,0,sizeof(temp)); while (((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')||(s[i]>='0'&&s[i]<='9'))&& i< len) { temp[j]=s[i]; j++;i++; } strcpy(q[++top].w,temp); } if(ed)continue; if(st&&!top) { print=1; printf("/\n"); } if(st&&top) { print=1; printf("/"); } if(top) { print=1; for(i=1;i<top;i++) printf("%s/",q[i].w); printf("%s\n",q[top].w); } if(print==0)printf("\n"); } }
2n皇后问题
给定一个 n∗n 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 n 个黑皇后和 n 个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都不在同一行、同一列或同一条斜线(包括正负斜线)上。问总共有多少种放法?nn 小于等于 88。
输入格式
输入的第一行为一个整数 n,表示棋盘的大小。
接下来 n 行,每行 n个 0 或 1 的整数,如果一个整数为 1,表示对应的位置可以放皇后,如果一个整数为 0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入1
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出1
2
样例输入2
4 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出2
0