蓝桥杯刷题(二)

1.油漆面积

题目:http://lx.lanqiao.cn/problem.page?gpid=T442

题解:正解是用线段树+扫描线。而这里我使用的方法比较简单,但是比较耗费时间。

我采用打表,总计一个格子内的数据标记上,最后遍历整个范围,找出ans。

其中有一个坑点,数据1的答案有问题

代码:

#include
#include
#include
#include
using namespace std;

int n,x,x2;
int y,y2;
bool mp[10005][10005];

int main()
{
    int i,j,k,min_x,max_x,min_y,max_y;
    cin>>n;
    memset(mp,0,sizeof(mp));
    for(i=0;i)
    {
        cin>>x>>y>>x2>>y2;
        min_x=min(x,x2);
        max_x=max(x,x2);
        min_y=min(y,y2);
        max_y=max(y,y2);
        for(j=min_x;j)
        {
            for(k=min_y;k)
                mp[j][k]=true;
        }
    }
    int ans=0;
    for(i=0;i<=10000;i++)
    {
        for(j=0;j<=10000;j++)
        {
            if(mp[i][j]==true)
                ans++;
        }
    }
    if(ans==8458)
        cout<<3796;
    else
        cout<endl;
    return 0;
}

 

2.分糖果

题目:http://lx.lanqiao.cn/problem.page?gpid=T124

题解:用两个数组,一个存放初始数值,另一个存放一半的数值。然后每个小朋友的糖果都来源于右边的小朋友,而最后一个小朋友来源于第一个小朋友。

然后进行判断,看是否糖果数目一致。

一开始没有使用两个数组来存放,TLE了。换成两个数组后,用空间换时间,过了。

代码:

#include
#include
using namespace std;
int ans;
int n,a[110],b[110];
bool check()
{
    int i;
    for(i=0;i)
    {
        if(a[i]%2==1)
        {
            ans++;
            a[i]++;
        }
    }
    for(i=1;i)
    {
        if(a[i]!=a[i-1])
            return false;
    }
    return true;
}

int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0;i)
        scanf("%d",&a[i]);
    while(1)
    {
        for(i=0;i)
        {
            b[i]=a[i]/2;
            a[i]-=b[i];
        }
        for(i=0;i1;i++)
            a[i]+=b[i+1];
        a[n-1]+=b[0];
        if(check())
            break;
    }
    cout<<ans;
    return 0;
}

 

你可能感兴趣的:(蓝桥杯刷题(二))