zhangas

Pay more attention

0%

8.1 SDKDACM

P3029 [USACO11NOV] Cow Lineup S

题目链接
求包含K种数字的最短连续子序列长度
双指针 维护连续子序列[L,R]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct node{
int x,id;
};
node a[50005];
int n,k;
unordered_map<int,int>mp;
bool cmp(node xx,node yy){
return xx.x<yy.x;
}
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i].x=read(),a[i].id=read();
if(!mp[a[i].id]){
k++;
mp[a[i].id]=1;
}
}
mp.clear();
sort(a+1,a+1+n,cmp);
int ans=1e9;
int cnt=0;
for(int l=1,r=1;r<=n;r++){
if(!mp[a[r].id]){
cnt++;
}
mp[a[r].id]++;
while(l<r&&mp[a[l].id]>1){
l++;
mp[a[l].id]--;
}
if(cnt==k)ans=min(ans,a[r].x-a[l].x);
}
cout<<ans;
}

P3029 P1934 封印

题目链接
1.dp[i]由上一层加上a[i]*N^2递推
2.dp[i]由前面第j层加上(a[j]+a[j+1]+…+a[i])x(a[j]+a[i])递推 需要满足a[i]+a[j]<=t这一条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int n,t;
int a[1005],b[1005],dp[1005];
int main(){
n=read(),t=read();
for(int i=1;i<=n;i++){
a[i]=read();
b[i]=b[i-1]+a[i];//a[i]的前缀和 用于O(1)求数组a的区间和
}
int m=n*n;
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++){
dp[i]=min(dp[i],dp[i-1]+a[i]*m);
for(int j=1;j<i;j++){
if(a[i]+a[j]<=t){
dp[i]=min(dp[i],dp[j-1]+(b[i]-b[j-1])*(a[i]+a[j]));
}
}
}
cout<<dp[n];
}