USACO 2012 February Contest, Bronze Division

来源:互联网 发布:java jlabel dialog 编辑:程序博客网 时间:2024/06/14 17:26

终于没有辜负达尔戈的期望了,1000分。

不出意外的话,3月的应该是silver了。

2月份加油!


A题

想法题。

枚举折叠点,有两类: knot点和非knot点,然后对于每个枚举的点进行for循环判断即可。

#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>using namespace std;#define MM(a,b) memset(a,b,sizeof(a));typedef unsigned long long u64;typedef long long lld;#define maxn 10050bool f[maxn];int pos[200];int main(){    freopen("folding.in","r",stdin);    freopen("folding.out","w",stdout);    MM(f,0);    int n,L,i,j;    cin>>n>>L;    for(i=1;i<=n;++i){        cin>>pos[i];        f[ pos[i] ]=1;    }    sort( pos+1, pos+1+n );    int ans=0;    for(i=2;i<n;++i){        int p= i-1, q= i+1;        for(;p>0&&q<=n;p--,q++){            if( pos[q]-pos[i] != pos[i]-pos[p] )                break;        }        if( p<=0 || q>n ){            ans++;            //printf("o %d\n", pos[i]);        }    }    for(i=1;i<n;++i){        double mid= pos[i]+ (pos[i+1]-pos[i]+0.0)/2.0;        int p= i,q=i+1;        for(;p>0&&q<=n;p--,q++){            if( pos[q]-mid != mid-pos[p] )                break;        }        if( p<=0 || q>n ){            ans++;            //printf("o %.lf\n", mid);        }    }    cout<<ans<<endl;}


B题

最多10个矩形的面积并。

我是 矩形切割 做的,记得矩形切割还是去年暑假学会的。

所有的x,y排序后去重。对每个给定的矩形,枚举小矩形,mark[x][y]。...


C题

递归,之前有做过类似的题目,要先统计些数据再递归,注意细节,注意分析

#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>using namespace std;#define MM(a,b) memset(a,b,sizeof(a));typedef unsigned long long u64;typedef long long lld;#define maxn 100lld a[maxn]={3,10,25,56,119,246,  501,  1012,  2035,  4082,  8177,  16368,  32751,  65518,  131053,  262124,  524267,  1048554,  2097129,  4194280,  8388583,  16777190,  33554405,  67108836,  134217699,  268435426,  536870881,  1073741792 //a[27]= 1073741792};void solve(lld n,int t){    if(t==0){        if(n==1) puts("m");        else puts("o");        return;    }    if( n<= (a[t-1]+3+t) ){        if( n==a[t-1]+1 ) puts("m");        else puts("o");        return;    }    else{        n-= (a[t-1]+3+t);        for(int i=0;;++i){            if( n<a[i] ){                solve( n, i );                break;            }        }        //solve(n-a[t-1]-3-t, t-1);    }}int main(){    freopen("moo.in","r",stdin);    freopen("moo.out","w",stdout);    /*freopen("out","w",stdout);    a[0]=3;    for(int i=1;;++i){        a[i]= 2*a[i-1]+3+i;        cout<<i<<"  "<<a[i]<<endl;        if( a[i]>1000000000 ) break;    }*/    lld n;    int i;    while(cin>>n){        for(i=0;;++i){            if( n<a[i] )                break;        }        solve(n,i);    }}