Codeforces Round #662 (Div. 2) A~C

A. Rainbow Dash, Fluttershy and Chess Coloring

 Codeforces Round #662 (Div. 2) A~C_第1张图片

 思路:

模拟一下会发现规律:如果格子边长是n,那么操作次数就是(n/2)+1

#include 
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 <

 B. Applejack and Storages

 Codeforces Round #662 (Div. 2) A~C_第2张图片

 

 思路:
首先要满足条件的话,可以有以前几种情况;

  • 边长重复超过4次的边有x种,x>=2
  • 边长重复超过4次的边有x种,边长重复超过4次的边有y种  x>=1,y>=2
  • 注意以上两种情况里的边互不包含;

然后初始统计,增删过程中统计边重复次数,并且记录次数是4和2的倍数的边的个数;根据上述条件判断即可;、

#include

using namespace std;
#define PII pair 
const int N =1e5+10;
int a[N];
int main()
{
	int n;
	cin >>n;
	int cnt1=0,cnt2=0;
	for(int i=0;i>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 <=2&&cnt2>=1)||(cnt2>=2)) puts("YES");
		else puts("NO");
	}
}

 C. Pinkie Pie Eats Patty-cakes

Codeforces Round #662 (Div. 2) A~C_第3张图片

思路:

 统计出来出现次数最多的数x,次数为k,那么类似于隔板法,其他的数可以往里面放;当出现次数最多的不止一个数时,那么可以把他们捆绑在一起,就相当于一个数了;然后再把剩下的往(k-1)个空隙里面插数即可;因为剩下的数不可能完全平均分配给(k-1)个空隙,所以最小值就是    剩下的 / (k-1)

#include

using namespace std;
#define PII pair 
const int N =1e5+10;
int a[N];
unordered_map 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<

 

你可能感兴趣的:(基础算法——数论,思维)