题解
Problem - A - Codeforces
1.这道题很简单,找出将当前数字放入字符串的最大值。
2.分情况讨论,有俩种情况,一种是大于等于数字d,那么这个数字d需要插入到最后字符串的位置。否则这个数字需要插入到第一次比它小的位置。
代码如下:
#include<stdio.h>
#include<string.h>
#define N 200100
char str[N];
char a[N],b[N];
int main()
{
int t,n,d,i,j,min,flag;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&d);
scanf("%s",str);
min=99;
flag=0;
j=0;
for(i=0;i<n;i++)
{
if(min>str[i])
{
min=str[i];
}
if(flag==0&&str[i]<d+'0')
{
flag=1;
j=i;
}
}
if(min>=d+'0')
{
printf("%s%c\n",str,d+'0');
}
else
{
strcpy(a,str);
a[j]=0;
strcpy(b,str+j);
printf("%s%c%s\n",a,d+'0',b);
}
}
return 0;
}
P1656 炸铁路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
1.这道题目时tarjan算法加桥的知识点。
可以看看我之前关于tarjan算法的一孔之见——2023/1/8总结_lxh0113的博客-CSDN博客
和桥——2023/1/12总结_lxh0113的博客-CSDN博客
tarjan算法是强连通算法,桥又叫割边,就是说去掉这条边,这条边对应的俩个顶点是否还有其他路径相连,如果没有,那么说这是桥。
2.在tarjan算法的基础上,有一个爷爷节点,父节点,儿子节点。桥的特点是,如果父节点的dfn值小于儿子节点的low值,说明儿子节点在这个图当中只能通过父节点。那么这个就是桥
3.会出现俩种情况,儿子节点访问过了,此时访问过了我们需要去刷新当前节点的low值,也就是出现的最早时间,如果儿子节点已经访问过了很有可能出现了强连通,它们在一个环里面。另外一个情况就是儿子节点没有被访问,此时,我们需要在这个儿子节点继续往下搜索(因为不确定儿子节点是否能回到父亲节点以上或者父亲节点)
4.然后就是排序啦,用的是c++的sort函数。
#include<stdio.h>
#include<algorithm>
#define Maxn 5100
#define N 160
using namespace std;
int mymap[N][N];
int dfn[N],low[N],time=1,n,m;
int len=0;
struct node
{
int u,v;
}res[Maxn];
int minz(int a,int b)
{
if(a>b) return b;
return a;
}
bool cmp(node a,node b)
{
if(a.u==b.u) return a.v<b.v;
return a.u<b.u;
}
int dfs(int pre,int x)
{
//桥,如果子节点的low值大于当前dfn值,说明没有别的路径
//如果小于等于当前dfn值,说明还有别的路径
//pre是父节点,x是当前节点,要找x的子节点
dfn[x]=low[x]=time++;
int i,y;
for(i=1;i<=n;i++)
{
if(mymap[x][i])
{
//如果有子节点,看孙子节点是否能到该节点
y=i;
if(dfn[y]&&y!=pre) low[x]=minz(low[x],dfn[y]);
//如果儿子节点已经被访问过了
//那么该点的low值需要刷新。
if(dfn[y]==0)
{
//如果该点没有访问过
dfs(x,y);
low[x]=minz(low[x],low[y]);
if(low[y]>dfn[x])
{
res[len].u=x;
res[len].v=y;
len++;
}
}
}
}
return 0;
}
int main()
{
int i,j,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
mymap[u][v]=1;
mymap[v][u]=1;
}
for(i=1;i<=n;i++)
{
if(dfn[i]==0)
{
dfs(0,i);
}
}
sort(res,res+len,cmp);
for(i=0;i<len;i++)
{
printf("%d %d\n",res[i].u,res[i].v);
}
return 0;
}
主要学习了MySQL
MySQL注释
单行注释:--或#
多行注释 /**/
数据类型
创建数据库:
creat database 名称;
在navicat中创建:
下面是创建一个数据库里面的表,表里面包含了这些元素。
最后一行的primary key的意思是把id作为主键。
修改表
表示在student这个表里面添加score字段。
新建多个字段
修改字段类型:
修改字段名称(可以直接理解为修改字段)
删除字段
删除多个字段:
删除表
查看表结构
上面这些操作是可以在新建表当中搞:(如果想要修改,就点击你想要修改的表,右击选择设计表)
查询表中所有数据
查询一列数据(指定的列)。
如果要查询多个指定的列,那么在from前面用逗号隔开即可。
使用别名查询:(把字段变成别名,以便于查看)
concat语句,合并列字段
查询时可以进行加减乘除运算
查询去重操作,用distinct语句即可。
条件查询,在后面加where语句,可以结合运算符使用。
比如:
插入单条数据:
如果想按照自己想要的字段顺序:
可以只插入自己想要的字段,但是必须插入主键的值,并且主键不能重复插入。主键值是整数并且是增长的,如果没有填写,就是默认自动增长。
如果要插入多组数据,那么需要在values后面加逗号批量插入。
下面这段代码表示,创建一个student1表格,主键是id,并且是默认自然增长的,name的初始值是666. 插入的时候如果不插入主键值,那么就会自然增长,不插入其他值,其他值就是我们所设的初始值。在navicat里面,字符串可以用单引号。这个自动增长永远是按照上一次的值来增长的,即使之前装满了数据,然后又清空了,自动增长还是会从上一次的开始,除非
修改所有行的字段数据 ,修改多个则添加逗号。
下面代表用where语句修改特定的数据,修改的是where语句后面id=2,修改的是id=2的数据的gender和name值
删除某行的数据,会删除where语句后面匹配的值。
删除整个表格,直接写delete from student;即可。
like语句
%代表像文件的通配符”*“,可以匹配多个字符,下面代表了,删除name以elios结尾的数据。