7月20号总结

一、Java学习

        ①线程

                (1)线程控制

                        

sleep当前正在执行的线程停留
join等待死亡

setDaemon

标记为守护线程

                        个人体会小结: 

                       sleep 当前进程停留个几秒

                        join当调用join的线程结束时才调用其他线程

                        SetDaemon当主线程结束时其他线程也结束

                        

                 (2)线程的生命周期

                        

                        个人体会小结

                       什么生命周期,不就是执行的过程吗,注意一个点就好了:在start后线程不一定立马执行,要抢到CPU,真是到哪里都内卷啊。

                (3)多线程的实现方式——2

  • 定义一个类实现runnable接口
  • 在类中重写run方法
  • 创建Thread类的对象,把类的对象最为构造方法的参数

                       个人体会小结

                        我看来第一种方法更为复杂,我到时候写项目的时候,用第二种就好了

                 (4)线程安全

                        基本实现:不要有多条语句共享数据

                        同步代码块:synchonized 

二、刷题

        嘉然小姐,夹心糖、鼠条,这三个词一定会成为我的梦魇的。或许等到多年以后,我在麦当劳点了份薯条,我依然会记得那个夏天的鼠条。

        F题:

        

#include<iostream>
#include<cstdio>
#include <algorithm>
#include <math.h>
using namespace std;
int n, ans = 0;
int a[100010];
int dp[100010] = {0};
int maxx(int x,int y)
{
	if(x>y)
	{
		return x;
	}
	else
	{
		return y;
	}
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	for (int i = 1; i <= n; ++i)
	{
		dp[i] = 1;
		for (int j = 1; j <= i; ++j)
		{
			if (a[j] < a[i])
			{
				dp[i] = maxx(dp[i], dp[j]+1);
			}
		}
		dp[i];
		ans = maxx(ans, dp[i]);
	}
	cout << ans << endl;
	return 0;
}

        看法与思路

        看到这个题,我真想问一句:牛桑,故乡的樱花开了吗?

        题目的意思就是要你求最长的子序列,但不一定要求连续,看到这里已经有个大概的思路了,还是 要dp,那不就一个一个的dp呗,

这个也很容易想到。 是不是感觉我的思路,代码都没得问题?我没过,红红火火恍恍惚惚哈哈哈哈。交了6次了,我已经与吐了。

        H题

         看法与思路

        这个题,挺有意思的。第一次交,以为只要比较两个的最大值就好了,要是相等就加个2嘛,这不就简简单单?

        

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
using namespace std;
int main(int argc, char const *argv[])
{
	int two,three;
	cin >> two >>three;
	int max1 = two * 2;
	int max2 = three*3;
	int finalmax;
	finalmax = max(max1,max2);
	if(max1!=max2)
	{
		cout << finalmax<<endl;
	}
	else
	{
		cout << finalmax +2<<endl;
	}
	return 0;
}

         交上去相似错在第四个样例。又仔细想了想,万一人数很多,前面就相等了,就不行了啊。

奥,原来是这样!!!那么关键点就在于,多久会相等一次。2*3=6,高度等于6的时候!!

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
using namespace std;
int main(int argc, char const *argv[])
{
	int two, three;
	cin >> two >> three;
	int max1 = two * 2;
	int max2 = three * 3;
	int finalmax;
	for (int i = 6; i <= max1 && i <= max2; i = i + 6)
	{
		if (max1 <= max2)
		{
			max1 = max1 + 2;
		}
		else
		{
			max2 = max2 + 3;
		}
	}
	cout << max(max1, max2) << endl;
	return 0;
}

        I题

          看法与思路

        最大的最小距离,真行啊。

         题目的意思很好理解,就不解释了。

         首先,很自然的就可以想到要对数组排序。关键这个最大的最小值要怎么找?题目给的数据范围这么大,肯定不能一个一个的暴力解决了,二分。二分的模板谁都知道,关键check要怎么写?要是住的下我就往大的找,要是住不下我就往小的找

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[900005];
int n, c;
bool check(int mid)
{
	int count = 1;
	int k = a[0];
	for (int i = 1; i < n; i++)
	{
		if (a[i] - k >= mid)
		{
			k = a[i];
			count++;
		}
	}
	if (count >= c)
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	int mid;
	while (scanf("%d%d", &n, &c) != EOF)
	{
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
		}
		sort(a, a + n);
		int L = 0, R = 900000000;
		int ans;
		while (L <= R)
		{
			mid = L+(R-L)/2;
			if (check(mid))
			{
				ans = mid;
				L = mid + 1;
			}
			else
			{
				R = mid - 1 ;
			}
		}
		cout << ans << endl;
	}
	return 0;
}

                  这不就搞定了吗!

三、心得体会

        怎么说呢,这周二分的题对我来说真的很难,从来没有接触过,看着别人一道又一道的刷过,显得我就像个傻子。我真的好像问一句,这些题真的很简单吗?这周大部分的时间花在刷题上了,终于理解了二分,也勉强的做出了一两个题,真是不容易啊。可能欠下的东西太多了吧,长吁短叹是没有意义的,你要追上别人,还有很长的路要走,加油吧,zss。下次再看到嘉然小姐的时候,希望你可以,淡然的说句“就这”。                       

                         

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值