百度之星 2012 初赛

没想到两场都是200分,虽然两场都只做两题。

初赛第一场: 题目:http://wenku.baidu.com/view/0dd551a8dd3383c4bb4cd2bb.html

A题:搜索一下,复杂度不算高

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
#include <bitset>
using namespace std;    

#define LL long long 
const int N = 2000;

struct node{
    int xl,xr,h;
}ar[N];
vector< pair<int,int> > v[N];
bool flag;
int T,n,m,k;
void dfs1(int k,int h){
    if(flag==1) return ;
    for(int i=v[k].size()-1;i>=0;i--){
        if(v[k][i].first<h) {
            if(v[k][i].second==0) dfs1(k+1,v[k][i].first);
            else dfs1(k-1,v[k][i].first);
            return ;
        }
    }
    if(k==1) flag=1;
}
void dfs2(int k,int h){
    if(flag==1) return ;
    if(h!=0){
        if(k-1>0) dfs1(k-1,h-1);
        if(k+1<=n) dfs1(k+1,h-1);
    }else{
        if(k-1==1) flag=1;
        if(k+1==1) flag=1;
    }
    for(int i=v[k].size()-1;i>=0;i--){
        if(v[k][i].first<h) {
            if(v[k][i].second==0) dfs2(k+1,v[k][i].first);
            else dfs2(k-1,v[k][i].first);
            return ;
        }else v[k].pop_back();
    }
    if(k==1) flag=1;
}
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&m,&k);
        flag=0;
        for(int i=0;i<=n;i++) v[i].clear();
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&ar[i].xl,&ar[i].xr,&ar[i].h);
            v[ar[i].xl].push_back( make_pair(ar[i].h,0) );
            v[ar[i].xr].push_back( make_pair(ar[i].h,1) );
        }
        for(int i=0;i<=n;i++) 
            sort(v[i].begin(),v[i].end());
        dfs2(k,1000000);
        if(flag==1) printf("Yes\n");
        else printf("No\n");
    }
}

 

B题:水题不多说了

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;    
#define LL long long 


LL len(LL x){
    if(x==0) return 1; 
    LL ans=0;
    for(LL i=x;i!=0;i/=10) ans++;
    return ans;
}

LL ok(LL a,LL x){
    LL lenx=len(x),ans=0;
    LL s=0,cnt=1;
    for(LL i=0;a!=0&&i!=lenx;a/=10,i++){
        s+=(a%10)*cnt;
        cnt*=10;
    }
    if(s>=x) ans++;
    if(a>0) ans+=a;
    return ans;
}

int main(){
    LL a,b,x,T;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld%lld",&x,&a,&b);
        a--;
        printf("%lld\n",ok(b,x)-ok(a,x));
    }
}

 

 初赛第二场: 题目:http://wenku.baidu.com/view/c2228c66ddccda38376baf0d.html

B题: 二分+并查集

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
using namespace std;
#define eps 1e-8
const int N=1100;

struct ufind{
    int f[N];
    void init(int x) { for(int i=0;i<=x;i++) f[i]=i;}
    int find(int x) { return f[x]==x?x:f[x]=find(f[x]);}
    void set_friend(int i,int j){ f[find(i)]=find(j);}
    bool is_friend(int i,int j){
        return find(i)==find(j) ? 1:0;
    }
}uf;

struct node{
    double x,y,z;
}ar[N];
int n,m;
double G[N][N];    
bool vis[N];

double ok(int i,int j){
    return (ar[i].x-ar[j].x)*(ar[i].x-ar[j].x)+
        (ar[i].y-ar[j].y)*(ar[i].y-ar[j].y)+
        (ar[i].z-ar[j].z)*(ar[i].z-ar[j].z);
}

bool solve(double mid){
    uf.init(n);
    for(int i=0;i<n;i++) for(int j=0;j<i;j++){
        if(G[i][j]<mid){
            uf.set_friend(i,j);
        }
    }

    for(int i=0;i<n;i++){
        vis[i]=false;
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        if(!vis[uf.find(i)]){
            vis[uf.find(i)]=1;
            cnt++;
        }
    }
    if(cnt<m) return false;
    else return true;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%lf%lf%lf",&ar[i].x,&ar[i].y,&ar[i].z);
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                G[i][j]=G[j][i]=ok(i,j);
            }
        }
        double left=0,right=1;
        while(left+eps<right){
            double mid=(left+right)/2;
            if(solve(mid)) left=mid;
            else right=mid;
        }
        int temp = int(left * 1000000.0 + 0.5);
        left = double(temp) / 1000000;
        printf("%.6lf\n",left);
    }
}

 

c题:dp

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
using namespace std;
#define eps 1e-8
const int N=1100;

pair<int,int> a[N];
struct node{
    int k,x,y;
}b[2];
int dp[N][N];
int ok(int i,int x){
    return a[i].first*b[x].x+a[i].second*b[x].y;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].first,&a[i].second);
        }
        for(int i=0;i<2;i++){
            scanf("%d%d%d",&b[i].k,&b[i].x,&b[i].y);
        }
        for(int i=1;i<=n;i++){
            for(int j=0;j<=i;j++){
                if(j!=0) dp[i][j]=dp[i-1][j-1]+ok(i,0);
                dp[i][j]=max(dp[i-1][j]+ok(i,1),dp[i][j]);
            }
        }
        int ans=0;
        for(int i=0;i<=min(n,b[0].k);i++)
            ans=max(dp[n][i],ans);
        printf("%d\n",ans);
    }
}
posted @ 2012-06-10 09:30  HaoHua_Lee  阅读(243)  评论(0编辑  收藏  举报