Codeforces Round #734 (Div. 3)
Codeforces Round #734 (Div. 3)A,B1题解(思路简单,代码好懂)
题目链接:
A. Polycarp and Coins
B1. Wonderful Coloring - 1
A. Polycarp and Coins
题目大意:买一个价格为n的商品,只用面值为1和2的硬币,输出面值为1和面值为2的硬币买下这件商品且两面值硬币数量差异最小的解法。(多组样例)
思路:把一枚1硬币和一枚2硬币捆绑成价值为3的硬币,先看能付多少钱,要是付不完剩下金额的再用一枚硬币(只可能剩下1或2元,再加一枚硬币足矣)。
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int cnt1=0;//硬币1数量
int cnt2=0;//硬币2数量
cnt1+=n/3;
cnt2+=n/3;
if(n%3==1) cnt1++;
if(n%3==2) cnt2++;
cout<<cnt1<<" "<<cnt2<<endl;
}
return 0;
}
B1. Wonderful Coloring - 1
题目大意:输入字符串,对其涂色,且满足以下条件:
1:一个字符可以被红绿涂色或者不涂。
2:一种字符不能被一种颜色涂两次。
3:红绿字符数量相同。
4:满足前三个条件,尽可能多地涂色。
有多组样例,求出每组被涂色为红的字符数。
思路:一个字符出现再多次也只可能被红和绿各涂一次,其余都是空白,开一个数组计数器(cnt[150])和一个数字计数器(记录可以涂色的字符个数,用count表示,初始为0),代码中记录每个字符的出现次数,如果小于2就让count加一,但是count是涂色总数,题目问的是红色数量,红色和绿色数量是一样的,只需count除以二就是最终答案。
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int cnt[150]={0};//注意初始为0
int count=0;
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(cnt[s[i]-'0']<2) count++;//将字符出现字数转化为字符对应ACSLL码值出现的次数
cnt[s[i]-'0']++;
}
cout<<count/2<<endl;
}
return 0;
}
可能有同学要问如果count是奇数怎么办,其实还是count除以二(向下取整),因为放一个不涂色就可以了,保证红绿数量一样。