CF 812
A 直接模拟
#include <stdio.h> #include <math.h> int main() { char map[17][17]; int i, j; for (i = 1; i <= 4; i++){ for (j = 1; j <= 4; j++){ scanf("%d", &map[i][j]); } } int ok = 0; for (i = 1; i <= 4; i++){ if (map[i][4] == 1){ for (j = 1; j <= 3; j++){ if (map[i][j]){ ok = 1; break; } int a = (i + j) % 4; if (a == 0)a = 4; if (map[a][j]){ ok = 1; break; } } } if (ok)break; } if (ok)printf("YES\n"); else printf("NO\n"); return 0; }
B n m
n 行 m+2列 旁边2列是楼梯
一开始站在左下角 问 要关掉所有的灯 1 最少走多少步 不能下楼
dp[i][0] dp[i][1] 表示这一层从左边出来 从右边出来
dp[i][0]=min(dp[i-1][0]+... , dp[i-1][1]+...); 挺好想的 还有一些细节
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<math.h> using namespace std; #define MAXN 10002 #define inf 1000000007 #define ll long long #define exp 1e-8 char z[25][105]; int dp[25][2]; int l[25],r[25]; int main() { int n,m; scanf("%d%d",&n,&m); int c1=n; for(int i=1;i<=n;i++) { scanf("%s",z[i]+1); r[i]=100; for(int j=1;j<=m+2;j++) { if(z[i][j]=='1') { c1=min(c1,i); l[i]=max(l[i],j); r[i]=min(r[i],j); } } } for(int i=n;i>c1;i--) { if(i==n) { if(l[i]==0) dp[i][0]=0; else dp[i][0]=l[i]-1+l[i]-1; dp[i][1]=m+2-1; } else { int a=dp[i+1][0]+1,a1=dp[i+1][1]+1; if(l[i]!=0) { a+=(l[i]-1)*2; } a1=a1+m+1; dp[i][0]=min(a,a1); int b=dp[i+1][0]+1,b1=dp[i+1][1]+1; b=b+m+1; if(r[i]!=100) { b1=b1+(m+2-r[i])*2; } dp[i][1]=min(b,b1); } } if(c1==n) { if(l[c1]==0) { printf("0\n"); return 0; } } // printf("%d %d %d\n",c1+1,dp[c1+1][0],dp[c1+1][1]); int a=dp[c1+1][0]+l[c1]; int a1=dp[c1+1][1]+(m+2-r[c1])+1; if(c1==n) { a--; a1=l[c1]-1; } printf("%d\n",min(a,a1)); return 0; } /* 2 2 0000 0100 2 2 0100 0000 3 2 0100 0000 0100 */
C n s
给你n个物品的费用 然后总的钱 1 满足 买的个数最多 2 满足花费少
买k个的花费是 a(i)+i*k
二分k 然后 排序nlogn
时间nlongnlogn
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<math.h> using namespace std; #define MAXN 100002 #define inf 1000000007 #define ll __int64 #define exp 1e-8 ll z[MAXN]; ll x[MAXN]; int main() { int n; ll s; scanf("%d%I64d",&n,&s); for(int i=1;i<=n;i++) scanf("%I64d",&z[i]); int l,r; l=0; r=n; int num; ll co; num=0; co=0; while(l<=r) { int mid=(l+r)>>1; for(ll i=1;i<=n;i++) { x[i]=z[i]+i*mid; } sort(x+1,x+n+1); ll sum=0; for(ll i=1;i<=mid;i++) sum=sum+x[i]; if(sum>s) r=mid-1; else { l=mid+1; if(mid>num) { num=mid; co=sum; } else if(mid==num&&co<sum) { co=sum; } } } printf("%d %I64d\n",num,co); return 0; }
posted on 2017-06-03 09:15 HelloWorld!--By-MJY 阅读(169) 评论(0) 编辑 收藏 举报