Codeforces 라운드 # 461 (사업부. 2) C, E

문제의 의미

주어진 , 주어진 케이 케이 .
수요가 여부 나는 < 제이 케이 I <J ≤ K , 대회 % 나는 = % 제이 n \ % 나 N = \ %의 J를

문제 해결

% 1 = 0 n \ % 1 = 0
다음, 그렇지 않은 경우.
n % 1 , n % 2 , . . . , n % k n \ % 1, n \ % 2, ..., n \ % K 스물 두 범위는
다음 만이있을 것이다 것을 발견 n % i = i 1 n \ % i는 1을 I =
즉, ( n + 1 ) % i = 0 (N + 1) % \ i는 0 =
이며 n + 1 = l c m ( 1 , 2 , . . . , k ) N + 1 = LCM (1,2, ..., K)
계승 성장 때문에 n 1 e 18 N \ LEQ 1E18
이를들 수있다.

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
using namespace std;
typedef long long ll;
const int maxn = 250050;
 
vector<int>G[maxn];
int A[maxn],c[maxn][10],col[maxn],Color[maxn];
int dep[maxn];
ll ans=0x3f3f3f3f3f3f3f3f,ret;
 
 
int main(){
    ll n,k;cin>>n>>k;
    for(int i=1;i<=k;i++){
        if((n%i)!=(i-1)){
            puts("No");
            return 0;
        }
    }
    puts("Yes");
}

이자형

문제의 의미

각각의 나무가있다 c i C_I 조류는 새 통화에 필요 c o s t i cost_i 마나, 호출은 자신을 증가 B 최대 마나, 나무가 추가됩니다 마무리 X 엑스 얼마나 많은 새 통화까지 추구 마나,

문제 해결

명확한 d p DP
키는 현재 상태의 마나를 얻고, 현재 마나를 알 방법이다.
당신은 최대 마나를 알고 싶다면, 당신은 얼마나 많은 전투 조류를 알고 있어야합니다.
새들의 수를 기록하기 때문에 상태는, 조류의 수를 기록 할 수 있도록 d p DP 값은 중요하지 않습니다 기록 마나로 사용할 수 있습니다. 새 같은 수의 더 나은 소환 마나 분명히위한

1 -1 전송을 용이하게하기 위해,이 상태로 얻을 수없는 대표, 우리는 하루의 끝 이후 증가 X 엑스 날 수입니다.
동등하게 공유 할 수 n 2 N ^ 2 복잡성.
모든 조류의 현재 수를 열거, 수의 열거 새들이 나무에 호출합니다.
직접 호출하지 마십시오 + X + X ,과 마나를 취할 m i n 나를
호출을 한 다음, 선정로부터 감산 플러스 X 엑스 , 테이크 m i n 나를

그들은 이상 최대 마나 생각할 수있는 경우에 질문입니다.
그러나 아직도 내가 열심히 일하겠습니다, 동료 팁에 의존하고 있습니다.
정말 훈련 동안 좋은 습관이 아닙니다 옛 동료를 찾습니다.

#include<bits/stdc++.h>
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define sf(x) scanf("%d",&x)
using namespace std;
typedef long long ll;
const int maxn = 250050;

string str[maxn];

struct node{
    int s,h;ll tmp;
    int id;
    friend bool operator < (node a,node b){
        return 1ll*a.s*b.h>1ll*b.s*a.h;
    }
}A[maxn];

int c[maxn],cost[maxn],pre[maxn];
ll dp[1050][10050];

int main(){
    int n,W,B,X;
    cin>>n>>W>>B>>X;
    FOR(i,1,n)sf(c[i]),pre[i]=pre[i-1]+c[i];
    FOR(i,1,n)sf(cost[i]);
    memset(dp,-1,sizeof(dp));
    dp[0][0]=W;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=pre[i-1];j++){
            if(dp[i-1][j]==-1)continue;
            dp[i][j]=max(min(dp[i-1][j]+X,W+1ll*B*j),dp[i][j]);
        }
        for(int j=0;j<=pre[i];j++){
            for(int k=0;k<=c[i]&&k<=j;k++){
                if(dp[i-1][j-k]<1ll*k*cost[i])continue;
                ll tmp=dp[i-1][j-k]-1ll*k*cost[i];
                dp[i][j]=max(min(tmp+X,W+1ll*B*j),dp[i][j]);
            }
        }
    }
    int ans=0;
    for(int i=0;i<=pre[n];i++){
        if(dp[n][i]==-1)continue;
        ans=max(ans,i);
    }
    cout<<ans<<endl;
}

게시 된 203 개 원래 기사 · 원 찬양 17 ·은 20000 +를 볼

추천

출처blog.csdn.net/mxYlulu/article/details/104129155