A. Beru-taxi (Codeforces 706A)
水题,求一下到每个点的距离,取最小值即可
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define N using namespace std; int n,x,y,p,q,s; double t,ans=1000000000; int main() { scanf("%d%d%d",&x,&y,&n); for(int i=0;i<n;i++) { scanf("%d%d%d",&p,&q,&s); t=(double)((p-x)*(p-x)+(q-y)*(q-y)); t=(double)sqrt(t); t=t/(double)s; if(t<ans) ans=t; } printf("%lf\n",ans); return 0; }
B. Interesting drink (Codeforces 704B)
有n个饮品店,各自的饮品价格为a[i]。q天里每天有b[i]的钱,问每天有几种饮品店可以选择。
可以直接 upper_bound(a, a + n, x) - a;
#include<stdio.h> #include<string.h> #include<algorithm> #define N 100005 using namespace std; int a[N],b[N],c[N],n,q,tot=0,maxx=0,k=0,sum=0; int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } scanf("%d",&q); for(int i=0;i<q;i++) { scanf("%d",&b[i]); if(b[i]>maxx) maxx=b[i]; } sort(a,a+n); tot=a[0]; while(tot-1<=a[n-1]) { // printf("c[%d]=%d\n",tot,sum); while(a[k]==tot) { k++; sum++; // printf("sum=%d\n",sum); } c[tot++]=sum; } for(int i=0;i<q;i++) { if(b[i]>=a[n-1]) printf("%d\n",n); else printf("%d\n",c[b[i]]); } return 0; }
C. Hard problem (Codeforces 706C)
DP,一开始不会
dp[i][0]:第i个字符串不反转所需最小能量
dp[i][1]:第i个字符串反转所需最小能量
#include<stdio.h> #include<string.h> #include<string> #include<algorithm> #define N 100005 using namespace std; long long a[N],n,dp[N][2],ok[N][2]; string s[N],res[N]; char t1[N],t2[N]; int main() { memset(a,0,sizeof(a)); memset(ok,0,sizeof(ok)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } for (int i=1; i<=n; i++) //s数组为原串,res为反转串 { scanf("%s",t1); s[i]=t1; int len=strlen(t1); for (int j=0; j<len; j++) t2[j]=t1[len-j-1]; t2[len]=0; res[i]=t2; } for(int i=1;i<=n;i++) { dp[i][0]=dp[i][1]=1e16; } dp[0][0]=dp[0][1]=0; ok[0][0]=ok[0][1]=1; for(int i=1;i<=n;i++) { if(ok[i-1][0]) { if(s[i]>=s[i-1]) { dp[i][0]=min(dp[i][0],dp[i-1][0]); ok[i][0]=1; } if(res[i]>=s[i-1]) { dp[i][1]=min(dp[i][1],dp[i-1][0]+a[i]); ok[i][1]=1; } } if(ok[i-1][1]) { if(s[i]>=res[i-1]) { dp[i][0]=min(dp[i][0],dp[i-1][1]); ok[i][0]=1; } if(res[i]>=res[i-1]) { dp[i][1]=min(dp[i][1],dp[i-1][1]+a[i]); ok[i][1]=1; } } } if (ok[n][0]==0 && ok[n][1]==0) { printf("-1\n"); return 0; } printf("%lld\n",min(dp[n][0],dp[n][1])); return 0; }
时间: 2024-10-28 22:41:38