Codeforces Round #460 (Div. 2) 前三题

Posted Cptraser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #460 (Div. 2) 前三题相关的知识,希望对你有一定的参考价值。

Problem A:题目传送门

题目大意:给你N家店,每家店有不同的价格卖苹果,ai元bi斤,那么这家的苹果就是ai/bi元一斤,你要买M斤,问最少花多少元。

题解:贪心,找最小的ai/bi。

技术分享图片
#include <cstdio>
using namespace std;
double minn=2e9,x,y,M;
int N;

int read()
{
    char c;while(c=getchar(),c<0||c>9);
    int x=c-0;while(c=getchar(),c>=0&&c<=9)x=x*10+c-0;
    return x; 
} 

inline double min(double x,double y){return x<y?x:y;}

int main()
{
    N=read(),M=read();
        for(int i=1;i<=N;i++){
            x=read(),y=read();
            minn=min(minn,M*x/y); 
        }
    printf("%.8lf",minn);
    return 0;
} 
Problem A

 

Problem B:题目传送门

题目大意:给一个数字K,求一个第K大的Perfect数,Perfect数指这个数数位上的数字之和为10。

题解:DFS即可。

技术分享图片
#include <cstdio>
#include <cstdlib>
using namespace std;

int K,cnt=0,a[11];

void print(int tot)
{
    for(int i=1;i<=tot;i++)putchar(a[i]+0);
    return ;
}

void search(int tot,int now,int less)
{
    if(now==tot){
        cnt++;
        if(cnt==K){print(tot);exit(0);}
        return ;
    }
    if(now==tot-1){a[tot]=less;search(tot,tot,0);return ;}
        for(int i=0;i<=less;i++){
            a[now+1]=i;
            search(tot,now+1,less-i);
        }
    return ;
}

int main()
{
    scanf("%d",&K);
    register int i,j;
        for(i=2;i<=10;i++){
            for(j=1;j<=9;j++){
                a[1]=j;
                search(i,1,10-j);
            }
        }
    return 0;
}
Problem B

 

Problem C:题目传送门

题目大意:给三个整数N,M,K,表示图的大小为N*M,求能坐的座位有连续K个的方案数。‘*’表示不能坐,“.”表示能坐。

题解:预处理每个点横着有连续几个,竖着有连续几个,然后找到一段连续的最大的点ans+=min(0,W-K+1)。W为这个点的值。K为一时特判,答案为所有能坐的位置总和。

技术分享图片
#include <cstdio>
#include <algorithm>
using namespace std;

int N,M,K,ans,cnt;
int a[2005][2005];
int ri[2005][2005],di[2005][2005];

int main()
{
    scanf("%d%d%d",&N,&M,&K);
    register int i,j;
        for(i=1;i<=N;i++){getchar();
            for(j=1;j<=M;j++){
                char c=getchar();
                if(c==.)a[i][j]=1,cnt++;
            }
        }
    if(K==1)return printf("%d",cnt),0;
        for(i=1;i<=N;i++)
            for(j=1;j<=M;j++)
                if(a[i][j])ri[i][j]=ri[i][j-1]+1,di[i][j]=di[i-1][j]+1;
        for(i=1;i<=N;i++)
            for(j=1;j<=M+1;j++){
                if(!a[i][j])ans+=(max(0,ri[i][j-1]-K+1));
            }
        for(j=1;j<=M;j++)
            for(i=1;i<=N+1;i++){
                if(!a[i][j])ans+=(max(0,di[i-1][j]-K+1));
            }
    printf("%d",ans);
    return 0;
}
Problem C

 

以上是关于Codeforces Round #460 (Div. 2) 前三题的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #460 (Div. 2)

Codeforces Round #460 (Div. 2) 前三题

Codeforces Round #460 (Div. 2) 919 笔记

Codeforces Round #460 (Div. 2)

Codeforces Round #460 (Div. 2) B Perfect Number(二分+数位dp)

Codeforces Round #460 (Div. 2) D. Substring BFS拓扑排序dp