A. Rainbow Dash, Fluttershy and Chess Coloring
思路:
模拟一下会发现规律:如果格子边长是n,那么操作次数就是(n/2)+1
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7;
typedef long long ll;
int main()
{
int t;
cin >>t;
while(t--)
{
ll n;
cin >>n;
cout <<n/2+1<<endl;
}
}
B. Applejack and Storages
思路:
首先要满足条件的话,可以有以前几种情况;
- 边长重复超过4次的边有x种,x>=2
- 边长重复超过4次的边有x种,边长重复超过4次的边有y种 x>=1,y>=2
- 注意以上两种情况里的边互不包含;
然后初始统计,增删过程中统计边重复次数,并且记录次数是4和2的倍数的边的个数;根据上述条件判断即可;、
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,string>
const int N =1e5+10;
int a[N];
int main()
{
int n;
cin >>n;
int cnt1=0,cnt2=0;
for(int i=0;i<n;i++)
{
int x;
cin >>x;
a[x]++;
if(a[x]%2==0) cnt1++;
if(a[x]%4==0) cnt2++,cnt1-=2;
}
int q;
cin >>q;
while(q--)
{
char op[2];
int x;
cin >>op>>x;
if(op[0]=='+')
{
a[x]++;
if(a[x]%2==0) cnt1++;
if(a[x]%4==0) cnt2++,cnt1-=2;
}
else
{
if(a[x]%4==0) cnt2-=1,cnt1++;
else if(a[x]%2==0) cnt1-=1;
a[x]--;
}
//cout <<cnt1<<" "<<cnt2<<endl;
if((cnt1>=2&&cnt2>=1)||(cnt2>=2)) puts("YES");
else puts("NO");
}
}
C. Pinkie Pie Eats Patty-cakes
思路:
统计出来出现次数最多的数x,次数为k,那么类似于隔板法,其他的数可以往里面放;当出现次数最多的不止一个数时,那么可以把他们捆绑在一起,就相当于一个数了;然后再把剩下的往(k-1)个空隙里面插数即可;因为剩下的数不可能完全平均分配给(k-1)个空隙,所以最小值就是 剩下的 / (k-1)
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,string>
const int N =1e5+10;
int a[N];
unordered_map<int,int> mp;
int main()
{
int t;
cin >>t;
while(t--)
{
mp.clear();
int n;
cin >>n;
int res=0,pos=0;
for(int i=1;i<=n;i++)
{
int x;cin >>x;
mp[x]++;
if(mp[x]>=res) pos=x,res=mp[x];
}
int cnt=0;
for(auto p:mp)
{
int x=p.second;
if(x==res) cnt++;
}
cout <<(n-res*cnt)/(res-1)+cnt-1<<endl;
}
}