2017蓝桥杯省赛(方格分割+)

来源:互联网 发布:蜂窝移动数据开关失效 编辑:程序博客网 时间:2024/05/30 21:58
方格分割
/*仔细观察样例数据可以发现,要满足题目所需要求,只需要剪切的线关于图案的中点中心对称。那么我们可以将格子格子之间接壤的看作边,边与边相交的看作点。则从(3,3)点出发,找一条边到达图案的外圈,不过值得注意的是,从(3,3)出发的是看错两个人出发,两个人的线路一直是对称。所以dfs中标记的时候要一步标记两个。最后的结果要除以4,因为题目中说要旋转对称的是同一种。*/#include<bits/stdc++.h>using namespace std;int visited[10][10];int ans=0;int dir[4][2]={0,1,1,0,0,-1,-1,0};void dfs(int x,int y){    if(x==0||y==0||x==6||y==6)    {        ans++;        return;    }    for(int i=0;i<4;i++)    {        int nx=x+dir[i][0];        int ny=y+dir[i][1];        if(visited[nx][ny])            continue;        visited[nx][ny]=1;        visited[6-nx][6-ny]=1;        dfs(nx,ny);        visited[nx][ny]=0;        visited[6-nx][6-ny]=0;    }}int main(){    memset(visited,0,sizeof visited);    visited[3][3]=1;    dfs(3,3);    printf("%d %d\n",ans,ans/4);}

分巧克力(二分,比赛的时候我是暴力的,,)

#include<algorithm>#include<string.h>#include<iostream>#include<stdio.h>#include<string.h>#include<vector>using namespace std;typedef long long ll;ll hi[100010];ll wi[100010];int n;ll k;bool isok(ll ans){    ll sum=0;    for(int i=0;i<n;i++)    {        sum+=(hi[i]/ans)*(wi[i]/ans);        if(sum>=k)            return true;    }    return false;}int main(){    scanf("%d%lld",&n,&k);    for(int i=0;i<n;i++)        scanf("%lld%lld",&hi[i],&wi[i]);    ll l=1,r=100000,ans;    while(l<=r)    {        ans=(l+r)/2;        if(isok(ans))            l=ans+1;        else            r=ans-1;    }    l++;    while(l--)    {        if(isok(l))            break;    }    printf("%lld\n",l);    return 0;}



0 0