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 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 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; }