Codeforces Round #734 (Div. 3) AB12C题解

A. Polycarp and Coins

题目大意:

用n枚2元硬币和m枚一元硬币支付某个价格,要求n与m的差值尽量小,

题解:

总价格除以三,余下的部分用一个一元或两元硬币来支付。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
const int N=2e5+5;
const int inf=0x3f3f3f3f;
 
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int x=n/3;
		int y=n%3;
		int ans1=x,ans2=x;
		if(y==2)
		{
			ans2++;
		}else if(y==1)
		{
			ans1++;
		}
		cout<<ans1<<" "<<ans2;
		cout<<endl;
	}
	return 0;
}

拼网速的题

B1 - Wonderful Coloring - 1

题目大意:

对字母进行着色,相同颜色中不能有相同字母,两种颜色的数目必须相等。

题解:

对出现次数不超过2的字母计数,最后除以二向下取整即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
const int N=2e5+5;
const int inf=0x3f3f3f3f;
 
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		map<char,int> mp;
		string a;
		cin>>a;
		int ans=0;
		for(int i=0;i<a.length();i++)
		{
			if(mp[a[i]]<=1)
			{
				mp[a[i]]++;
				ans++;
			}
		}
		cout<<ans/2<<endl;
	}
	return 0;
}

B2 - Wonderful Coloring - 2

题目大意:

对字母进行着色,与B1的差别是颜色种类数和要求输出每个位置的涂色方法

题解:

模拟,就硬模拟。
开vector储存每个字符的所有出现位置,同时记录当前应该涂什么颜色和已经涂了多少块,当剩余块数小于颜色总数时就不再涂了,因为这样无法做到所有颜色的出现次数相等。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
const int N=2e5+5;
const int inf=0x3f3f3f3f;
struct xx{
	vector<int> vec;
};
xx x[N];
int b[N];
int a[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,k;
		cin>>n>>k;
		for(int i=1;i<=n;i++)
		{
			x[i].vec.clear();
		}
		for(int i=1;i<=n;i++)
		{
			b[i]=0;
		}
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			x[a[i]].vec.push_back(i);
		}
		int all=0;
		for(int i=1;i<=n;i++)
		{
			if(x[i].vec.size()>k)
			{
				all+=k;
			}else{
				all+=x[i].vec.size();
			}
			
		}
		int noned=all%k;
		int need=all-noned;
		int now=1;
		int ued=0;
		bool ok=0;
		for(int i=1;i<=n;i++)
		{
			int hav=1;
			for(int j=0;j<x[i].vec.size();j++)
			{
				b[x[i].vec[j]]=now;
				ued++;
				if(ued==need){
					ok=1;
					break;
				}
				now++;
				if(now>k)
				{
					now=1;
				}
				hav++;
				if(hav>k) break;
			}
			if(ok) break;
		}
		for(int i=1;i<=n;i++)
		{
			cout<<b[i]<<" ";
		}
		cout<<endl;
		
	}
	return 0;
}

动态二维数组真好用,STL岂是如此不便之物!

C. Interesting Story

题目大意:

N个字符串,只包含a到e五种字符,要求让其中一种大于其余四种的和,
结构体储存某个字母减去其余字母的数量,由五种字母的贡献分别对数组结构体排序,取最大即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
const int N=2e5+5;
const int inf=0x3f3f3f3f;
struct alp{
	string a;
	int la,lb,lc,ld,le;
};
alp q[N];
bool cmpa(alp x,alp y)
{
	return x.la>y.la;
}
bool cmpb(alp x,alp y)
{
	return x.lb>y.lb;
}
bool cmpc(alp x,alp y)
{
	return x.lc>y.lc;
}bool cmpd(alp x,alp y)
{
	return x.ld>y.ld;
}
bool cmpe(alp x,alp y)
{
	return x.le>y.le;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			q[i].la=q[i].lb=q[i].lc=q[i].ld=q[i].le=0;
		}
		for(int i=1;i<=n;i++)
		{
			string s;
			cin>>s;
			q[i].a=s;
			for(int j=0;j<s.length();j++)
			{
				if(s[j]=='a')
				{
					q[i].la++;
				}else{
					q[i].la--;
				}
				if(s[j]=='b')
				{
					q[i].lb++;
				}else{
					q[i].lb--;
				}
				if(s[j]=='c')
				{
					q[i].lc++;
				}else{
					q[i].lc--;
				}
				if(s[j]=='d')
				{
					q[i].ld++;
				}else{
					q[i].ld--;
				}
				if(s[j]=='e')
				{
					q[i].le++;
				}else{
					q[i].le--;
				}
			}
		}
		int ans=0;
		int sum=0;
		int count=0;
		sort(q+1,q+1+n,cmpa);
		for(int i=1;i<=n;i++)
		{
			sum+=q[i].la;
			if(sum>0) count++;
			else break;
		}
		ans=max(ans,count);
		sum=0;
		count=0;
		sort(q+1,q+1+n,cmpb);
		for(int i=1;i<=n;i++)
		{
			
			sum+=q[i].lb;
			if(sum>0) count++;
			else break;
		}
		ans=max(ans,count);
		sum=0;
		count=0;
		sort(q+1,q+1+n,cmpc);
		for(int i=1;i<=n;i++)
		{
//			if(sum<0) break;
			sum+=q[i].lc;
			if(sum>0) count++;
			else break;
		}
		ans=max(ans,count);
		sum=0;
		count=0;
		sort(q+1,q+1+n,cmpd);
		for(int i=1;i<=n;i++)
		{
//			if(sum<0) break;
			sum+=q[i].ld;
			if(sum>0) count++;
			else break;
		}
		ans=max(ans,count);
		sum=0;
		count=0;
		sort(q+1,q+1+n,cmpe);
		for(int i=1;i<=n;i++)
		{
//			if(sum<0) break;
			sum+=q[i].le;
			if(sum>0) count++;
			else break;
		}
		ans=max(ans,count);
		cout<<ans<<endl;
	}
	return 0;
}

给你五个字母你就写五遍一模一样的代码,那要是给你二十六个字母你是不是要写过五百多行?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值