RT,想拿部分分(快考试了嘛),但是一直不知道错在哪里,55分,正常来说应该是70pts,错在第四个点上,也没有题解写记忆化所以只能求助了
这个苦逼明天上whk了,周三晚上绝对给给为大佬点上关注!
谢谢,这种感觉真的好憋得慌
#include<bits/stdc++.h>
#define max(A,B) (A<B?B:A)
#define min(A,B) (A>B?B:A)
#define bug cout<<"I AK IOI"<<endl;
#define gc getchar
using namespace std;
const int N=1e4+100;
inline void print(int x) {if (x < 0) putchar('-'), x = -x; if(x > 9) print(x / 10); putchar(x % 10 + '0');}
inline int read(){int res = 0, f = 0; char ch = gc();for(; !isdigit(ch); ch = gc()) f |= (ch == '-'); for(;isdigit(ch);ch=gc()) res = (res << 1) + (res << 3) + (ch ^ '0');return f ? -res :res;}
int n,m,k,ans=1e9,jil[N];
struct node{
int onn,inn;
}w[N],zb[N];
int f[1005][105];
int Max=-1;
inline int dfs(int x,int y,int jis)
{
// cout<<x<<endl;
Max=max(Max,x);
if(jis>=ans) return 1e9;
if(y-w[x].inn>0 && (!jil[x+1] || (y-w[x].inn>zb[x+1].inn && y-w[x].inn<zb[x+1].onn))){
if(f[x+1][y-w[x].inn]!=1e9) f[x][y]=f[x+1][y-w[x].inn];
else f[x][y]=min(f[x][y],dfs(x+1,y-w[x].inn,jis));
}
for(int i=1,j=y+w[x].onn;;i++,j+=w[i].onn)
{
if(j>m) j=m;
if(jil[x+1] && (j<=zb[x+1].inn || j>=zb[x+1].onn)) {
if(j<m) continue ;
else break;
}
if(f[x+1][j]!=1e9) f[x][y]=min(f[x][y],f[x+1][j]+i);
else f[x][y]=min(f[x][y],i+dfs(x+1,j,jis+i));
if(j>=m) break ;
}
return f[x][y];
}
signed main(){
int a,b,c;
n=read(),m=read(),k=read();
// if(n==500 and m==50 and k==26){
// cout<<0<<endl<<14;
// return 0;
// }
for(int i=1;i<=n;i++){
a=read(),b=read();
w[i]=node{a,b};
for(int j=1;j<=m;j++) f[i][j]=1e9;
}
for(int i=1;i<=k;i++)
{
a=read(),b=read(),c=read();
++a;
zb[a]=node{c,b};jil[a]=1;
}
for(int i=1;i<=m;i++){
if(jil[1] && (i>=zb[1].onn || i<=zb[1].inn)) continue ;
f[1][i]=dfs(1,i,0);
ans=min(ans,f[1][i]);
}
// cout<<f[10][2]<<endl;
if(ans==1e9){
int qwq=0;
for(int i=1;i<Max;i++) if(jil[i]) qwq++;
printf("0\n%d",qwq);
}
else printf("1\n%d",ans);
}