T1 LGTB 玩扫雷
思考:
纯模拟题,没啥说的。
#include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) int n,m,map[1005][1005]; char s[233]; int fx[]={0,0,-1,-1,-1,0,1,1,1},fy[]={0,-1,-1,0,1,1,1,0,-1}; int main(){ //freopen("mine.in","r",stdin); //freopen("mine.out","w",stdout); scanf("%d%d",&n,&m); up(1,n,i){ scanf("%s",s+1); up(1,m,j){ if(s[j]=='*') map[i][j]=1; } } up(1,n,i){ up(1,m,j){ if(map[i][j]) printf("*"); else{ int tot = 0; up(1,8,fuck){ int x = i+fx[fuck]; int y = j+fy[fuck]; if(map[x][y]) tot++; } printf("%d",tot); } } printf("\n"); } return 0; }
T2 LGTB 学分块
思考:
最大值最小 这种词语就是二分答案的一般套路,但是如果直接对三个块进行二分会发现无从下手,所以需要优化。
最直接的一个思路就是枚举1-n每个点 将其分为第1块 之后在另外的另一块中进行二分,分成两块。
#include <cstdio> #include <algorithm> #define up(a,b,c) for(register int c=a;c<=b;++c) typedef long long ll; using std::min; using std::max; ll n,a[10005],K1,K2,K3,Out=1e18+7,sum[10005]; int main(){ freopen("divide.in","r",stdin); freopen("divide.out","w",stdout); scanf("%lld",&n); up(1,n,i){ scanf("%lld",&a[i]); sum[i]=sum[i-1]+a[i]; } if(n==1){ printf("%lld",a[1]); return 0; } if(n==2){ printf("%lld",max(a[1],a[2])); return 0; } up(1,n,i){ K1 = sum[i-1]; ll l = i+1,r=n+1; //ll Fuck = 888; while(l<r-1){ ll mid = (l+r)>>1; if(sum[mid-1]-K1<=sum[n]-sum[mid-1]) l = mid; else r = mid; } K2 = sum[l-1] - K1; K3 = sum[n] - sum[l-1]; Out = min (Out,max(K1,max(K2,K3))); K2 = sum[l] - K1; K3 = sum[n] - sum[l]; Out = min (Out,max(K1,max(K2,K3))); } printf("%lld\n",Out); return 0; }
T3 LGTB 玩THD
待补题