周报

本周因为周末的蓝桥杯校内训练赛,所以重点放在了好久没看的C语言算法方面。还继续学习了部分SQL语法。

C语言算法

题目描述 nnn 位同学(编号从 111 到 nnn)同时来到体育馆报名签到,领取准考证和参赛资料。为了有序报名,这 nnn 位同学需要按编号次序(编号为 111 的同学站在最前面)从前往后排成一条直线。然而每一位同学都不喜欢拥挤,对于第 iii 位同学,如果有另外一位同学距离他/她的距离小于 aia_iai​,那么就会发生冲突。小可可想知道如果要不发生任何冲突的情况下,这 nnn 位同学排队的队列最短长度是多少。
输入格式 第一行一个整数 nnn ,表示报名签到的同学人数。
第二行有 nnn 个整数,第 iii 个整数 aia_iai​ 表示第 iii 个同学必须与其他同学保持的距离。
输出格式 输出一行,包括一个整数,表示这 nnn 位同学排队队列的最小长度。
注意: nnn 位同学要按 111 到 nnn 的次序从前往后排队。
输入输出样例 输入 #1
复制
3
3 1 2 输出 #1
复制
5

#include<stdio.h>
int max(int a,int b)
{
    if(a>b)
    return a;
    else
    return b;
}
int n,a,b;
long long ans;
int main()
{
    scanf("%d",&n);
    b=0;
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        if (b!=0) ans+=max(a,b);
        b=a;
    }
    printf("%lld\n",ans);
    return 0;
}

题目描述 SH的跑步成绩一直不太理想。为了帮助SH提高成绩,KC决定和他进行一次赛跑。比赛的起点设在农场主的屋前,他们同时出发,沿着同一方向,直到跑到终点----农场远处的一棵树下。
他们的跑步速度在一些时间段内是恒定的。比如:SH在前3个时间段速度是5,接着6个时间段内速度是10。他们的比赛总时间相同。他们希望能统计出在整个比赛过程中领先顺序的变化次数。举个例子,某个时刻SH领先,下个时刻KC领先,这就是一次领先顺序的变化;如果某个时刻SH领先,接下来一段时间KC赶上来并和SH齐头并进,但最终还是超过了SH,这也是一次领先顺序的变化。
输入格式 第1行:N和M(1 <= N, M <= 1000)。
接下来的N行:每行两个整数,描述SH跑步的一段,分别表示该段SH跑步的速度和持续这种速度的时间。所有的数据范围 [1…1000]。
再接下来的M行:每行两个整数,描述KC跑步的一段,分别表示该段KC跑步的速度和持续这种速度的时间。所有的数据范围 [1…1000]。
输出格式 一行:整个比赛过程中领先顺序的变化次数。
输入输出样例 输入 #1
复制
4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9
输出 #1
复制
2

#include<stdio.h>
int n, m, wn = 0, wm = 0, vn[1001], tn[1001], vm[1001], tm[1001];
int nt = 1, mt = 1, z = -1, ans = -1;
int work(int x)
{
    if (x > 0)return 1;
    else if (x == 0)return z;
    return 0;
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &vn[i], &tn[i]);
    for (int i = 1; i <= m; i++)
    {
        scanf("%d%d", &vm[i], &tm[i]);
        while (mt <= i)
        {
            if (tm[mt] == 0 && mt <= m + 1)
            {
                mt++;
                continue;
            }
            if (tn[nt] == 0 && nt <= n + 1)nt++;
            wm += vm[mt];
            tm[mt]--;
            wn += vn[nt];
            tn[nt]--;
            int s = wm - wn;
            if (work(s) != z)
            {
                ans++;
                z = work(s);
            }
        }
    }
    if (ans == -1)ans = 0;
    printf("%d", ans);
    return 0;
}

本题思路
首先读入n和m,然后读入SH的速度vn[i]和持续时间tn[i],之后读入KC的速度vm[i]和持续时间tm[i],但是在读入KC数据的同时,我们便开始处理数据,大概思路就是定义两个变量wn = 0, wm = 0来存储两个人分别已经跑过的距离,然后比较,如果wn-wm的符号改变了,那么ans++。

题目描述
一排树,每两棵相邻的树之间的间隔都是111米。我们可以把马路看成一个数轴,马路的一端在数轴000的位置,另一端在LLL的位置;数轴上的每个整数点,即0,1,2,…,L0,1,2,…,L0,1,2,…,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式 第一行有222个整数 L(1≤L≤10000)L(1 \le L \le 10000)L(1≤L≤10000) 和 M(1≤M≤100)M(1 \le M \le 100)M(1≤M≤100),LLL代表马路的长度,MMM代表区域的数目,LLL和MMM之间用一个空格隔开。

接下来的MMM行每行包含222个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出格式 111个整数,表示马路上剩余的树的数目。
输入输出样例 输入 #1
复制
500 3
150 300
100 200
470 471
输出 #1
复制
298
思路:
第一遍,将路上的所有树打上标记,表示这个点没有被访问过。
第二遍,读入区间的头和尾,从这个区间的头开始循环,到尾结束,标记为访问过。
第三遍,顺序访问路上的树,只要没访问过,计数加1,这样就求出了路上所有还存在的树的数目。

#include<stdio.h>
int main()
{
    int l,m,a[10001]={0},sum=0,start,end;
    scanf("%d %d",&l,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&start,&end);
        for(int j=start;j<=end;j++)
        {
            if(a[j]==0)
            a[j]=1;
        }
    }
    for(int k=0;k<=l;k++)
    {
        if(a[k]==0)
        sum++;
    }
    printf("%d",sum);
}

SQL学习

SQL AND & OR 运算符

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

AND 运算符实例

使用 AND 来显示所有姓为 “Carter” 并且名为 “Thomas” 的人:

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
OR 运算符实例

使用 OR 来显示所有姓为 “Carter” 或者名为 “Thomas” 的人:

SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
结合 AND 和 OR 运算符

我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):

SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
SQL ORDER BY 子句

ORDER BY 语句用于对结果集进行排序。

ORDER BY 语句

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

以字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company

以字母顺序显示公司名称(Company),并以数字顺序显示顺序(OrderNumber):

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

以逆字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

以逆字母顺序显示公司名称,并以数字顺序显示顺序号:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。

SQL INSERT INTO 语句
INSERT INTO 语句

INSERT INTO 语句用于向表格中插入新的行。

语法

INSERT INTO 表名称 VALUES (值1, 值2,…)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

插入新的行

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

在指定的列中插入数据

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
SQL UPDATE 语句

Update 语句
Update 语句用于修改表中的数据。

语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
更新某一行中的一个列
我们为 lastname 是 “Wilson” 的人添加 firstname:

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'

更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city):

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
SQL DELETE 语句

DELETE 语句

DELETE 语句用于删除表中的行。

语法
DELETE FROM 表名称 WHERE 列名称 = 值
删除某行

“Fred Wilson” 会被删除:

DELETE FROM Person WHERE LastName = 'Wilson' 

删除所有行

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name

或者:

DELETE * FROM table_name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值