[NOIP2014] Zhenti обзор

Ссылка на тему

Версия Big Bang рок-ножницы-бумага является моделирование, не говори

Объединенные веса перечислять каждую точку, статистику она какие-либо совместные гири двух сыновей, статистика и максимальную сумму, когда техническое обслуживание на линии

Полет птица DP хороший вопрос, не трудно думать об использовании дпа [я] [J] представляет собой минимальное количество кликов, чтобы добраться до I-й строки, J высоты, прямое перечисление I, J переведен в положение следующего столбца будет TLE, потребность оптимизация

#include<iostream>
#include<cstring>
#include<cstdio>
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
using namespace std;

const int N=10010;
const int M=2010;
const int INF=100000;

const int ch_top=4e7+3;
char ch[ch_top],*now_r=ch-1;
inline int read(){
    while(*++now_r<'0');
    register int x=*now_r-'0';
    while(*++now_r>='0')x=x*10+*now_r-'0';
    return x;
}

int n,m,k,X[N],Y[N],cnt[N],s[N],num;
int dp[N][M],low[N],high[N],Max;

int main()
{
//  freopen("a.in","r",stdin);
    fread(ch,1,ch_top,stdin);
    n=read(); m=read(); k=read();
    for(int i=0;i<n;++i){
        X[i]=read(); Y[i]=read();
        low[i]=1; high[i]=m;
    }
    low[n]=1; high[n]=m;
    int P,L,H;
    while(k--){
        P=read(); L=read(); H=read();
        low[P]=L+1; high[P]=H-1;
        ++cnt[P];
    }
    for(int i=1;i<=n;++i)
        cnt[i]+=cnt[i-1];
    for(int i=0;i<=n;++i)
        for(int j=0;j<=m;++j)
            dp[i][j]=INF;
    for(int i=1;i<=m;++i)
        dp[0][i]=0;
    for(int i=0;i<n;++i){
        num=0;
        for(int j=high[i];j>=low[i];--j)//从上往下依次转移,有利于后面优化时间
          if(dp[i][j]<INF){//先转移向上跳的情况 
            s[++num]=j;
            Max=max(Max,i);
            int g=(low[i+1]-j)/X[i];//直接计算需要向上跳几次达到low[i+1]
            if(g<1) g=1;
            int h=j+g*X[i];
            if(h<low[i+1]) ++g,h+=X[i];
            while(h<=high[i+1]){
                if(dp[i+1][h]>dp[i][j]+g)
                    dp[i+1][h]=dp[i][j]+g;
                else break;//优化时间,如果dp[i+1][h]已经有了更好的方案,一定是向上跳了若干步后转移过来的,那么dp[i+1][h+k*X[i]]也可以被跳到
                ++g; h+=X[i];
            }
            if(high[i+1]==m)
                dp[i+1][m]=min(dp[i+1][m],dp[i][j]+(m-j)/X[i]+1);//计算到天花板的步数并转移
        }
        for(int l=1,j=s[l];l<=num;j=s[++l]) //后转移向下落的情况 
          if(dp[i][j]<INF){
            int t=j-Y[i];
            if(low[i+1]<=t&&t<=high[i+1])
                dp[i+1][t]=min(dp[i+1][t],dp[i][j]);
        }
    }
    int ans=INF;
    for(int i=low[n];i<=high[n];++i)
        if(dp[n][i]<INF)
            ans=min(ans,dp[n][i]);
    if(ans<INF){
        puts("1");
        printf("%d\n",ans);
        return 0;
    }
    puts("0");
    printf("%d\n",cnt[Max]);
    return 0;
}

сайт передатчик Wi-Fi на том, чтобы думать, как насилие насилие

Сориентироваться в соответствии со значением вопросов, прежде всего в состоянии отметить конечную точку, и отметьте все точки боковой и конечную точку точек находятся в связи, и, наконец, найти кратчайший на линии

Эта проблема будет решать уравнение непосредственно фугасными способным, мы обнаружили, что если исходное выражение принимает значение 0, после того, как по модулю большого простого числа по-прежнему 0, исходная формула является результатом большого простого числа вы используете несколько по модулю полученные результаты также 0, так что если вы застряли, но вы знаете, как эта тема до сих пор 998244353 19260817 19491001 или более или 2147483647

Кроме того, расчет времени без Цинь Цзюшао О (п), я не знаю, что использовать эту вещь ..

#include<iostream>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;

const int MAXN=110;
const int MAXM=1000010;
const int MOD=2147483647;

int n,m,a[MAXN];

inline int read(){
    int x=0,f=1; char c=getchar();
    while(c<'0') { if(c=='-') f=-1; c=getchar();}
    while(c>='0') x=(x*10+c-'0')%MOD,c=getchar();
    return x*f;
}

int cnt,ans[MAXM];

inline bool check(int x){
    int ans=0,y=1;
    for(int i=0;i<=n;++i){
        ans=(ans+a[i]*y)%MOD;
        y=y*x%MOD;
    }
    return ans==0;
}

signed main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=0;i<=n;++i)
        a[i]=read();
    for(int i=1;i<=m;++i)
        if(check(i)) ans[++cnt]=i;
    printf("%lld\n",cnt);
    for(int i=1;i<=cnt;++i)
        printf("%lld\n",ans[i]);
    puts("");
    return 0;
}

рекомендация

отwww.cnblogs.com/yjkhhh/p/11635351.html
рекомендация