社区讨论

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 条回复,欢迎继续交流。

正在加载回复...