一、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。下次再看到嘉然小姐的时候,希望你可以,淡然的说句“就这”。