A.
补题过程:说实话今天找规律还是花了好长时间,因为例子好少,直接看不出来就只能从题目上下手,但这次题目说的好模糊看不懂(苦笑),结果发现还是要自己找规律,题目就说了一个要求不同的网格相邻。
找规律:首先涂最外面的一圈,涂最外面的一圈一次后,我们开始涂第二次,但这个时候由于我们要求的是最小的圈,所以在涂第二次的时候,我们把最外面的一圈剩下的涂满,还要再往里把倒数第二层涂一次,然后以此类推。
结果:最外面的一层2次,其余1次,因为每层之间n差了2,所以对于总层数n我们可以知道有(n/2-1)个1次,1个2次,相加起来就是n/2+1,从而得出公式。
AC代码:
#include <cstdio>
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int t;
cin>>t;
cout<<t/2+1<<endl;
}
return 0;
}
B.
题意:我们有n根各种长度的木棒,经过q次增加一根或减少某根长度的木棒后,求每次增减操作后能否用这些木棒构造出一个长方形和正方形。
注意:每个图形的边只用一个木棒!(开始以为多个木棒也可以,结果直接wrong在test 2上了。)
思路:
通过的方向就两种,第一种是一个正方形,一个长方形;第二种两个正方形。所以我们定两个数据来判断,sum1和sum2.sum1用来记录4个相同长度木棒的组数(4个一组),sum2用来记录去掉一组sum1中的组数之后,2个相同长度木棒的组数(2个一组),如果sum1>=2或sum1==1并且sum2>=2.
ps:如果不去掉sum1的一组的话,直接把sum2设置为所有木棒中2个相同长度的组数,sum2>=4即可,后来尝试了一下也可以。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
int n,i,sum1=0,sum2=0,q,w;
cin>>n;
for(i=0;i<n;i++)
{
cin>>w;
if(a[w]%4+1==4)
{
sum1++;
sum2--;
}
else
{
if(a[w] % 4 + 1 == 2)
{
sum2++;
}
}
a[w]++;
}
cin>>q;
while(q--)
{
char c;
cin>>c>>w;
if(c=='+')
{
if(a[w]%4+1==4)
{
sum1++;
sum2--;
}
else
{
if(a[w]%4+1==2)
{
sum2++;
}
}
a[w]++;
}
else
{
if(a[w]%4==0)
{
sum1--;
sum2++;
}
else
{
if(a[w] % 4 == 2)
{
sum2--;
}
}
a[w]--;
}
if(sum1>=2||(sum1==1&&sum2>=2))
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
}
}