9.00-11.00
浏览式大概了解学习mvc,css
11.00-
vj题
最长递增子序列_F
我的百度翻译告诉我题意是,找到包含n的最长连续递增子序列,我都被搞自闭了我说啊这也太动态了吧想不通怎么写,好久之后才知道正确题意,简单多了
这个题可以用动态规划来写,dp【i】存储以a【i】结尾的递增子序列的长度
ans=max(dp1....n);
原理嘞我感觉我讲不清,直接看例子吧
n=6
a【6】 2 1 3 4 6 5
dp【6】 1 1 2 3 4 4
每次判断a[i]和a[j]的大小,如果a[i]>a[j],获取dp[i]和dp[j]+1中的较大值
void Dp()
{
for(int i=0;i
时间复杂度是O(n^2),提交时间超限了
一开始看到限制条件1≤N≤100,000我就应该想到
用一个b【ans】数组存储序列,数组的长度就是该题的解,另ans=1(序列初始值就是1)
如果b【ans】>a【i】,将a【i】放到b序列的尾部
否则,查找到b【ans】中第一个大于或者等于a【i】的数,将a【i】替换到那个位置(ans没变)
(虽然最后b序列里不一定是最长递增子序列,但是长度是正确的)
优化算法,查找到b【ans】中第一个大于或者等于a【i】的数时,可以用二分查找降低时间复杂度
可以直接调用二分查找函数,使用algorithm头文件
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
算法过程在遇到的问题:ans++ 和 ++ans
我之前用的ans++,样例都过不去,出来的一个答案,比n还大,一想就能想到是计数记错了,将ans++改为了++ans就过了
对于ans++的实现是:
int temp;
temp = ans;
ans = ans+1;
return ans;
(关于这个涉及到了一个寄存器的概念)
对于++ans的实现是
ans = ans+1;
return ans;
投票_G
不难看出这道题需要用二分来写,思路是慢慢想出来的捏
我一开始想到的答案实际上实现的是,每一张纸条上的值都相等,算的一个平均值,思路完全错了
首先如果n==m,答案就是所有网站中票数最多的那个,另它为mmax
上界 r=mmax (模拟的n==m的时候)
下界 l=0 (模拟的所有网站都没有票数的时候)
ac核心代码
bool check(int x)
{
int cnt=0;//代表需要的纸条数
for(int i=0;im)
return false;
}
return true;
}
ceil()向上舍入最接近的整数值
floor()向下舍入最接近的整数值
round()对浮点数进行四舍五入
搭积木_H
分析可知,如果n个人2、4、6、8、10得搭积木,m个人3、6、9、12得搭积木
仅当搭的积木为6的倍数的时候,可能会搭一样的积木
另如果不与只能搭用高度为3的人比较,n个人能搭的最高积木为ans2=n*2
另如果不与只能搭用高度为2的人比较,m个人能搭的最高积木为ans3=n*3
如果ans2,ans3的最小值都大于6,说明肯定会有搭重复积木块的人,因为要求最少能搭的堆堆,所以可以判断ans2、ans3这两个数中,小的那个数去搭不是6的倍数的积木
核心代码
int ans2=2*n;
int ans3=3*m;
for(int i=6;i<=min(ans2,ans3);i+=6){
if(ans2<=ans3){
ans2+=2;
}
else ans3+=3;
}
cout<
切鼠条_J
这个题就很简单一个二分,重点是精度问题
因为输入的是两位小数,所以在将鼠条们存入数组的时候,可以都先乘以100,方便计算
我不晓得为什么样例明明都过了还一直WA,无语
代码先放这吧
#include
#include
#include
#include
using namespace std;
const int N=1e4+10;
int n,k;
double a[N],mmax=0;
bool check(int x)
{
int cnt=0;
for(int i=0;i=k)
return true;
else
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i