蓝桥杯刷题(二)
1.油漆面积
题目:http://lx.lanqiao.cn/problem.page?gpid=T442
题解:正解是用线段树+扫描线。而这里我使用的方法比较简单,但是比较耗费时间。
我采用打表,总计一个格子内的数据标记上,最后遍历整个范围,找出ans。
其中有一个坑点,数据1的答案有问题
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
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<n;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<max_x;j++)
{
for(k=min_y;k<max_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<<ans<<endl;
return 0;
}
2.分糖果
题目:http://lx.lanqiao.cn/problem.page?gpid=T124
题解:用两个数组,一个存放初始数值,另一个存放一半的数值。然后每个小朋友的糖果都来源于右边的小朋友,而最后一个小朋友来源于第一个小朋友。
然后进行判断,看是否糖果数目一致。
一开始没有使用两个数组来存放,TLE了。换成两个数组后,用空间换时间,过了。
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int ans;
int n,a[110],b[110];
bool check()
{
int i;
for(i=0;i<n;i++)
{
if(a[i]%2==1)
{
ans++;
a[i]++;
}
}
for(i=1;i<n;i++)
{
if(a[i]!=a[i-1])
return false;
}
return true;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
while(1)
{
for(i=0;i<n;i++)
{
b[i]=a[i]/2;
a[i]-=b[i];
}
for(i=0;i<n-1;i++)
a[i]+=b[i+1];
a[n-1]+=b[0];
if(check())
break;
}
cout<<ans;
return 0;
}