2015年3月19日 星期四

[TIOJ 1837][IOI 2013] ArtClass

作法:

總之就是亂做一通 + 經過別人的提示才過的。我一開始還在想判白色區塊和黑色區塊的格子數,後來發現不行,改成判白色區塊和黑色區塊的最大矩形,後來發現也會爛掉。最後是改成看每個點和他的四個相鄰點,去計算有幾組相鄰點的顏色差到了某個程度以上,這樣可以成功把第二種圖和第三種圖分出來,因為第三種圖是最多的,第二種圖大概也有 1/4 ,剩下第一種和第四種要再分。

後來聽別人分第一種和第四種的方法是,去看有多少組相鄰點的顏色相差很多,第四種圖的組數會比第一種圖的少,但他們之間的分界我亂試了很久才過,還有判斷顏色相差很多的函式和判斷顏色是否一樣的函式我也是亂做的,後來得到的準確率好像是 90.3% ,總之就是亂寫過了。

另外,何達睿的作法是看每一個橫排的亂七八糟度(?),code 附在下面,比我的簡潔好多QQ。還有周逸的作法是在多考慮綠色的多少,好像是看平方和之類的,如果特別多那就是第二種圖,沒有詳細聽他講,結果他就把我的CBD大頭貼判成第二種圖( 印象派風景畫 )了XDD

code :

#include<bits/stdc++.h>
#define DB double
#define MAX(x,y,z) max(x,max(y,z))
#define ADD(x,y,z) (x+y+z)
using namespace std;
const int maxn=1000 ;
 
int ABS(int x)
{
    return x>0 ? x : -x ;
}
 
int a[maxn][maxn][3] ;
bool same(int x1,int y1,int x2,int y2)
{
    int x=0 ;
    for(int i=0;i<3;i++)
    {
        x+=ABS(a[x1][y1][i]-a[x2][y2][i]) ;
        if(ABS(a[x1][y1][i]-a[x2][y2][i])>10) return 0 ;
    }
    return 1 ;
}
 
int dif(int x1,int y1,int x2,int y2)
{
    return ADD(ABS(a[x1][y1][0]-a[x2][y2][0]),
               ABS(a[x1][y1][1]-a[x2][y2][1]),
               ABS(a[x1][y1][2]-a[x2][y2][2])) ;
}
 
int n,m ;
int dx[]={1,-1,0,0},dy[]={0,0,1,-1} ;
 
int solve()
{
    int cnt=0 ;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++)
        for(int k=0;k<4;k++)
    {
        int nx=i+dx[k] , ny=j+dy[k] ;
        if(nx<0||nx>=n||ny<0||ny>=m) continue ;
        if(!same(i,j,nx,ny)) cnt++ ;
    }
 
    DB ans=cnt*100.0/4.0/n/m ;
    if(ans>=64.0) return 3 ;
    if(ans>=21.0) return 2 ;
 
    cnt=0 ;
    for(int i=0;i<n;i++) for(int j=0;j<m;j++)
        for(int k=0;k<4;k++)
    {
        int nx=i+dx[k] , ny=j+dy[k] ;
        if(nx<0||nx>=n||ny<0||ny>=m) continue ;
        if(dif(i,j,nx,ny)>180) cnt++ ;
    }
    if(cnt>7000) return 1 ;
    return 4 ;
}
 
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++) for(int j=0;j<m;j++)
            scanf("%d%d%d",&a[i][j][0],&a[i][j][1],&a[i][j][2]) ;
        printf("%d\n",solve()) ;
    }
}

看橫排的亂七八糟度的 code :

http://imgur.com/YCz2qBF

沒有留言:

張貼留言