wxy 3.24 1903

v>

丢失的数字
签到题,WA1发,数组名字还是要根据所存的数据的意义取名字,最好不要取a,aa这样的数组容易混淆
同学聚会
注意题意的理解,避免在书写过程中出现重构的现象
最大岛屿
数组范围一开始就要写对
下大雪了
强连通分量模板题
上课点名
vector 的insert复杂度理论上是O(n) ,但是实际上会跑起来快一点。如果代码比较短的话,可以尝试一
有时候感觉复杂度很玄学
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=3e4+100;
struct Node{
int id,num;
LL ans;
}b[MAXN];
LL a[MAXN];
int cmp(Node a,Node b)
{
return a.num<b.num;
}
int cmp1(Node a,Node b)
{
return a.id<b.id;
}
vector<LL> v;
int main()
{
int n,m; scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i].num);
b[i].id=i;
}
sort(b+1,b+m+1,cmp);
int pre=1,next;消灭复读机
1.字符串是从1开始的还是从0开始的,在遍历的时候一定要注意;2.按照dfs序去遍历不一定能够把空间
都遍历过,还是要通过dfs访问
山区修路
n只有500,可以考虑n^2的DP,不管是单调不增还是单调不减,最好就是在原来的序列上进行修改,
那么直接在原来的序列上进行sort,然后DP[i] [j]表示第i个路段选取第j个数,那么前i-1个路段只能选取1-j
的数,那么选取min(DP[i-1] [ 1-- j] ) +abs(a[i] -a[j]),搞一个minn作为临时变量,更新最小值可以降低一
维的复杂度
vector<LL>::iterator it;
for(int i=1;i<=m;i++){
next=b[i].num;
for(int j=pre;j<=next;j++){
it=lower_bound(v.begin(),v.end(),a[j]);
v.insert(it,a[j]);
}
pre=next+1;
b[i].ans=v[b[i].id-1];
}
sort(b+1,b+m+1,cmp1);
for(int i=1;i<=m;i++){
printf("%lld\n",b[i].ans);
}
return 0;
}
/*
7 4
9 7 2 8 14 1 8
1 2 6 6
*/
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=510;
LL a[MAXN],b[MAXN],dp1[MAXN][MAXN],dp2[MAXN][MAXN];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int T; scanf("%d",&T);
while(T--){
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
int n; scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){木工的烦恼
应为n很小,所以考虑暴力,要割n-1刀,枚举每一刀是横着割的还是竖着割的,每次都是对对应的坐标
进行平分,再进行下一次的枚举就可以
LL minn=1e18;
for(int j=1;j<=n;j++){
dp1[i][j]+=abs(a[i]-b[j]);
minn=min(minn,dp1[i-1][j]);
dp1[i][j]+=minn;
}
}
sort(b+1,b+n+1,cmp);
for(int i=1;i<=n;i++){
LL minn=1e18;
for(int j=1;j<=n;j++){
dp2[i][j]+=abs(a[i]-b[j]);
minn=min(minn,dp2[i-1][j]);
dp2[i][j]+=minn;
}
}
LL ans=1e18;
for(int i=1;i<=n;i++){
ans=min(ans,dp1[n][i]);
ans=min(ans,dp2[n][i]);
}
printf("%lld\n",ans);
}
return 0;
}
# include <bits/stdc++.h>
using namespace std;
double dfs(double x,double y,int n)
{
if(x<y) swap(x,y);
if(n==1) return x/y;
double res=1e18;
for(int i=1;i<n;i++){
res=min(res,max(dfs(x,y*i/n,i),dfs(x,y*(n-i)/n,n-i)));
}
for(int i=1;i<n;i++){
res=min(res,max(dfs(x*i/n,y,i),dfs(x*(n-i)/n,y,n-i)));
}
return res;
}
int main()
{
int x,y,n;
scanf("%d%d%d",&x,&y,&n);
printf("%.6f\n",dfs(x,y,n));
return 0;捡拾金币
关键点:考虑金币和金币之间是否再限定事件内到达,如果能到达,则再前一个状态上+1作为当前状
态,n^2暴力,最后一个循环就可以了
数字游戏
决策单调性优化,待补
不是很能理解为什么mid可以做到把每一个点都遍历一遍
}
# include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4+100;
int t[MAXN],x[MAXN],y[MAXN],f[MAXN];
int main()
{
int n,m; scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&t[i],&x[i],&y[i]);
f[i]=1;
}
for(int i=2;i<=m;i++){
for(int j=1;j<i;j++){
if(t[i]-t[j]>=abs(x[i]-x[j])+abs(y[i]-y[j])) f[i]=max(f[i],f[j]+1);
}
}
int ans=0;
for(int i=1;i<=m;i++){
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}
/*
2 2
1 1 1
2 2 2
*/
# include <bits/stdc++.h>
using namespace std;
const int MAXN=5e5+100;
int a[MAXN],f[MAXN],g[MAXN];
int n;
void solve1(int l,int r,int L,int R)
{
if(l>r||L>R) return ;
int pos=0,mid=(l+r)>>1; double mx=0;
for(int i=L;i<=R&&i<=mid;++i){if((double)a[i]+sqrt(mid-i)>=mx)
pos=i,mx=(double) a[i]+sqrt(mid-i);
}
//cout<<"!!!!"<<mid<<" "<<l<<" "<<r<<endl;
f[mid]=a[pos]+ceil(sqrt(mid-pos));
solve1(l,mid-1,L,pos);
solve1(mid+1,r,pos,R);
}
void solve2(int l,int r,int L,int R)
{
if(l>r||L>R) return ;
int pos=0,mid=(l+r)>>1; double mx=0;
for(int i=R;i>=L&&i>=mid;--i){
if((double)a[i]+sqrt(i-mid)>=mx)
pos=i,mx=(double)a[i]+sqrt(i-mid);
}
g[mid]=a[pos]+ceil(sqrt(pos-mid));
solve2(l,mid-1,L,pos);
solve2(mid+1,r,pos,R);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
solve1(1,n,1,n);
solve2(1,n,1,n);
for(int i=1;i<=n;i++){
printf("%d\n",max(f[i],g[i])-a[i]);
}
return 0;
}
posted @ 2022-02-27 13:37  fengzlj  阅读(36)  评论(0)    收藏  举报