项目:项目开始准备进行文件的读写
dp开始看了
开始敲阿哈算法了
关于那个单调栈的问题
学习成功展示
文件常用的操作无非是读,写,改,移
虽然我有学过c语言,但是只是浅尝辄止。
所以我先把c语言常用的文件打出来https://blog.csdn.net/weixin_35193765/article/details/117129436?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1https://blog.csdn.net/weixin_35193765/article/details/117129436?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0.no_search_link&spm=1001.2101.3001.4242.1这个把常用的文件进行了解释说明,然后现在我就可以开始说我的项目;
我进行的推箱子目前只用到了结构体,数组,然后算法就只有栈。所以我要开始着手于文件的功能。
目前我给自己画的饼是今天要写完用户的登录和注册。
dp
(yysy)dp给我爬真的好难,根本不会
害,突然发现我根本都不会说dt
直接发链接,证明我看过吧
阿哈算法
说一下dfs与bfs的区别吧
bfs:宽度搜索
他是走一步就扩散一步,最终来到终点
dfs:深度搜索
是先走一步,然后将这一步走到头,撞到南墙,我就回去一步,然后继续撞南墙,最后到了终点。
关于单调栈
题目链接
n 个罪犯排成一列,第 i 个罪犯手持长度为 L i 的机械利爪。当铃声响起时,每个人都会把站在自己前面的一些人杀掉。所有人都在同一时刻动手杀人。也就是说,当且仅当 j < i 并且 j ≥ i - L i 时,第 i 个人能杀掉第 j 个人。
给定机械利爪的长度,你需要计算出铃响之后还有多少人活着。
第一行输入包含 1 个整数 n ( 1 ≤ n ≤ 10 6 ) —— 代表罪犯的数量。
第二行输入包含 n 个以空格间隔的整数 L 1 , L 2 , ..., L n ( 0 ≤ L i ≤ 10 9 ) —— 代表第 i 个人手持的机械利爪的长度为 L i 。
输出 1 个整数 —— 铃响之后还活着的人数。
4 0 1 0 10
1
2 0 0
2
10 1 1 3 0 0 0 2 1 0 3
3
代码
#include<stdio.h>
int a[1000010];
main()
{
int min(int a,int b);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int sum=0;
int s=n;
for(int i=n-1;i>=0;i--)
{
if(i<s)
{
sum++;
s=min(s,i-a[i]);
}
else
s=min(s,i-a[i]);
}
printf("%d\n",sum);
}
int min(int a,int b)
{
if(a>b)
return b;
else
return a;
}
Farmer John的奶牛在风中凌乱了它们的发型……
每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。
比如下面这个例子:
* * * * = *
= * * * = *
= * - * = * 奶牛面向这边-->
= * = * = *
= - = = = *
= = = = = =
1 2 3 4 5 6
('*'表示空的,这是译者为了格式特意弄的,原题没有)
令ci表示第i只奶牛能够看到的发型数量,请计算c1 + c2 + c3 + … + cN的值
对于上面这个例子,答案为3 + 0 + 1 + 0 + 1 + 0=5。
#include<stdio.h>
long long int q[80010];
main()
{
long long int n;
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&q[i]);
long long int stack[80010];
long long top=0;
long long int sum=0;
for(int i=1;i<=n;i++)
{
if(top==0||q[stack[top]]>q[i])//空栈我就进栈或者我栈中的数比要进栈的数大,这个数就
//进栈
stack[++top]=i;//进栈的操作,保留值
else
if(q[stack[top]]<=q[i])//如果将要进栈的数大于等于等于我栈中的数,我栈中数出栈
{
while(q[stack[top]]<=q[i]&&top!=0)//继续判断下一个符合不,或者如果我全部出
//栈,为空栈,我就
{
sum=sum+i-stack[top]-1;//通过这种方式处理
top--;
}
stack[++top]=i;//最后那个将要进栈得数进去
}
}
for( int i=1;i<top;i++)//处理没有进栈的数
sum=sum+n-stack[i];
printf("%lld\n",sum);
}