社区讨论
25分,蒟蒻求指教……
P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi6gg2w5
- 此快照首次捕获于
- 2025/11/20 04:28 4 个月前
- 此快照最后确认于
- 2025/11/20 04:28 4 个月前
CPP
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct column{
int p,l,h;
}c[10000];
int n,m,k,x[10000],y[10000],p[10000],l[10000],h[10000],now=2,ans=0x7fffffff;
int f[10001][1001];
inline LL read()
{
int n=0,k=1;
char ch=getchar();
while ((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
if(ch=='-') k=-1;
while (ch<='9'&&ch>='0')
{
n=n*10+ch-'0';
ch=getchar();
}
return n*k;
}
inline void print(LL n)
{
if(n<0) {putchar('-');n=-n;}
if(n>9) print(n/10);
putchar(n%10+'0');
return;
}
inline bool cmp(column a,column b) {return a.p<b.p;}
inline int g(int a,int b){return a%b==0?(a/b):a/b+1;}
int main(int argc,char *argv[])
{
memset(f,0x7f,sizeof(f));
n=read();
m=read();
k=read();
for(int i=0;i<n;i++) {x[i]=read();y[i]=read();}
for(int i=1;i<=k;i++)
{
c[i].p=read();
c[i].l=read();
c[i].h=read();
}
sort(c+1,c+k+1,cmp);
for(int i=c[1].h-1;i>c[1].l;i--)
{
if(i+y[c[1].p-1]<=m){while(i>c[1].l){f[c[1].p][i]=0;i--;}break;}
else if(i-x[c[1].p-1]>0) {f[c[1].p][i]=1;}
}
for(int i=c[1].p+1,high,low;i<=n;i++)
{
if(i==c[now].p)
{
high=c[now].h-1;
low=c[now].l+1;
now++;
}
else
{
high=m;
low=1;
}
if(high>=m) for(int h=1;h<=m;h++){int mi=f[i-1][h]+g(m-h,x[i-1]);if(f[i][m]>mi)f[i][m]=mi;}
for(int j=low;j<=min(high,m-1);j++)
{
for(int kk=1;j-kk*x[i-1]>0;kk++)
{
int mi=kk+f[i-1][j-kk*x[i-1]];
if(f[i][j]>mi) f[i][j]=mi;
}
if((j+y[i-1]<=m)&&(f[i][j]>f[i-1][j+y[i-1]])) f[i][j]=f[i-1][j+y[i-1]];
if((i==n)&&(ans>f[i][j])) ans=f[i][j];
}
}
if(ans<1e7) {puts("1");print(ans);return 0;}
else
{
puts("0");
for(int i=k;i>0;i--) for(int j=c[i].l+1;j<c[i].h;j++) if(f[c[i].p][j]<0x7f) {print(i);return 0;}
}
puts("0");
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...