本周因为周末的蓝桥杯校内训练赛,所以重点放在了好久没看的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