[鐵一中OI模擬賽]2017.8.20 Day2
阿新 • • 發佈:2017-08-24
log algorithm def 但是 gis typedef tar cnblogs type
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
待補題
[鐵一中OI模擬賽]2017.8.20 Day2