1. 程式人生 > >Codeforces Round #460 (Div. 2) 前三題

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

one using pan log opened || names hid alt

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) 前三題