Codeforces 补题 round 1 contest 797

A. k-Factorization

质因子分解,统计一下即可。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const LL MAXN = 1e5+10;
const LL INF = 0x3f3f3f3f;

LL n,k;
LL a[MAXN];
LL num;
void Eular(LL n){
    num = 0;
    clr(a);
    for(LL i=2;i*i<=n;i++){
        while(n%i==0){
            a[num] = i;
            num++;
            n /= i;
        }
    }
    if(n != 1)  num++;
}

int main(){
    while(scanf("%d%d",&n,&k)!=EOF){
        Eular(n);
        LL ans = 1;
        if(num >= k) {
            for(LL i=0;i<k-1;i++){
                printf("%d ",a[i]);
                ans *= a[i];
            }
            printf("%d\n",n/ans);
        }
        else cout<<"-1"<<endl;
    }
    return 0;
}

B. Odd sum

模拟即可

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;

int n;
int a[MAXN];
int b[MAXN],c[MAXN];
int n1,n2;
int sum ;
bool cmp(int a,int b){
    return a > b;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i] > 0)  {
            b[n1++] = a[i];
            sum += a[i];
        }
        else if(a[i] < 0) c[n2++] = -a[i];
    }
    if(sum % 2 == 1)    cout<<sum<<endl;
    else{
        int flag1 = 0,flag2 = 0;
        sort(b,b+n1);
        sort(c,c+n2);
        int x = INF , y = INF ;
        for(int i=0;i<n1;i++){
            if(b[i]%2 == 1){
                x = min(x,b[i]);
                break;
            }
        }
        if(x == INF) flag1 = 1;
        for(int i=0;i<n2;i++){
            if(c[i] %2 == 1){
                y = min(c[i],y);
                break;
            }
        }
       // cout<<sum<<endl;
        if(y == INF ) flag2 = 1;
        int ans;
        //cout<<x <<"   "<<y<<endl;
        if(flag1== 1) ans = sum - y;
        else if(flag2 == 1) ans = sum - x;
        else ans = max(sum - x,sum - y);
        cout<< ans <<endl;
    }
    return 0;
}

C. Minimal string

倒序维护最小的字符 ,每次与栈顶元素比较。若栈顶元素小则出栈输出,否则,新元素入栈。
 

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;

char s[MAXN],minn[MAXN];

int main(){
    scanf("%s",s);
    int len = strlen(s);
    for(int i=len-1;i>=0;i--){
        if(i == len - 1) minn[i] = s[i];
        else minn[i] = min(minn[i+1],s[i]);
    }
    stack<char>st;
    char top;
    for(int i=0;i<len;i++){
        if(st.empty())
            st.push(s[i]);
        else{
            while(!st.empty()){
                top = st.top();
                if(top <= minn[i]){
                    st.pop();
                    printf("%c",top);
                }
                else    break;
            }
            st.push(s[i]);
        }
    }
    while(!st.empty()){
        top = st.top();
        printf("%c",top);
        st.pop();
    }
    return 0;
}

E - Array Queries

部分dp

当k值较大的时候,我们暴力就可以,反而dp会浪费时间,WA了好多发,取临界值为410。k<=400时用dp直接将结果达成表,

k>400时我们直接暴力。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const int N = 410;
int n,p,k,q;
int a[MAXN];
int dp[MAXN][N];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&q);
    for(int i=n;i>=1;i--){
        for(int j=0;j < N;j++){
            if(a[i] + i + j > n) dp[i][j] = 1;
            else dp[i][j] = dp[a[i] + i + j][j] + 1;
        }
    }
    while(q--){
        scanf("%d%d",&p,&k);
        if(k > N - 10){
            int num = 0;
            while(p <= n){
                p = p + k + a[p];
                num ++;
            }
            printf("%d\n",num);
        }
        else    printf("%d\n",dp[p][k]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/l18339702017/article/details/81489394