COJ 1697:模拟

Posted 更强一点才行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COJ 1697:模拟相关的知识,希望对你有一定的参考价值。

题意:给一个边长A B C的长方体,求取出N个1*1*1的正方体后所剩几何体的表面积(包括内部)

 

思路:取出正方体后对原几何体表面积的影响,取决于取这个正方体前,其与原几何体接触的面数

比如说该正方体取出前有4个面和原几何体有联系,那取出后表面积+2

这样可以看到面数为0 1 2 3 4 5 6,分别对应表面积变化-6 -4 -2 0 2 4 6

以此考虑就好

#include"cstdio"
#include"queue"
#include"iostream"
using namespace std;
const int N = 2005;
struct node{
    long long x,y,z;
    node(){}
    node(long long a,long long b,long long c):x(a),y(b),z(c){}
}p[N];
 
int s[7];
int pre[N];
long long a,b,c,n;
 
int get_(node t){
    int ans=6;
    if(!t.x) ans--;
    if(!t.y) ans--;
    if(!t.z) ans--;
    if(t.x==a-1) ans--;
    if(t.y==b-1) ans--;
    if(t.z==c-1) ans--;
    return ans;
}
 
bool check(node a,node b){
    if(a.x==b.x&&a.y==b.y&&(a.z-b.z==1||a.z-b.z==-1)) return true;
    if(a.x==b.x&&a.z==b.z&&(a.y-b.y==1||a.y-b.y==-1)) return true;
    if(a.z==b.z&&a.y==b.y&&(a.x-b.x==1||a.x-b.x==-1)) return true;
    return false;
}
 
int main(){
    //freopen("in.txt","r",stdin);
    s[0]=-6;
    for(int i=1;i<=6;i++) s[i]=s[i-1]+2;
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&n)){
        for(int i=0;i<n;i++){
            long long x,y,z;
            scanf("%lld%lld%lld",&x,&y,&z);
            p[i]=node(x,y,z);
        }
 
        long long ans=(a*b+b*c+a*c)*2;
        for(int i=0;i<n;i++) pre[i]=get_(p[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++)
                if(check(p[i],p[j]))
                    pre[i]--;
            ans+=s[pre[i]];
        }
        printf("%lld\n",ans);
    }
    return 0;
}

 

以上是关于COJ 1697:模拟的主要内容,如果未能解决你的问题,请参考以下文章

[COJ0528]BJOI幸运数

[COJ6024]合并果子·改(强化版)

[COJ0988]WZJ的数据结构(负十二)

COJ 1691:前缀和

COJ 1686:记忆化搜索

[codevs1105][COJ0183][NOIP2005]过河