Codeforces Round #460 (Div. 2) 前三題
阿新 • • 發佈:2018-02-04
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*10Problem A+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 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);}Problem Breturn ; } 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 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) 前三題