【暑期实训】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皇后问题

给定一个 nn 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 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
posted @ 2021-07-03 15:42  WJEMail  阅读(41)  评论(0编辑  收藏  举报