Educational Codeforces Round 47 (Rated for Div. 2)

A. Game Shopping

题意:给定两个长度不同的数组,第一个数组里面的元素代表商品ai的价值,第二个数组里的元素代表钞票ci的价值。将从第一个商品往后买东西,如果钞票的金额大于商品的价值,则可以买,并且本张钞票花出无找零。问最多能买几个东西。很显然可以用双指针做。

#include <iostream>
using namespace std;
const int     N=1010;
int a[N],q[N];
int n,m;
int main()
{
    int sum=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    scanf("%d",&q[i]);
    for(int i=1,j=1;i<=n;i++)
    {
        if(a[i]<=q[j])
        {
            sum++;
            j++;
        }
    }
    printf("%d\n",sum);
 } 
View Code

B. Minimum Ternary String

题意:给定一个仅由 0,1,2三种字符组成的字符串,2和0不能互换位置,其余字符之间可以任意交换。要求输出经过交换后的最小字典序的字符串,

分析:首先,由于要最小字典序的字符串,应该尽量按照0,1,2的顺序排列。1没有任何限制,所以我们先遍历数组统计1和0在字符串中出现的个数,当第一个2出现时代表2以后的0无法和2交换换到前面来,所以停止统计0的个数。

最后我们 先输出统计的0和1最后在第一个出现2位置的字符串开始向后遍历如果不是1就输出。

#include <iostream>
#include <cstring>
using namespace std;
string s,ans1,ans2;
bool flag=true;
int k;
int main()
{
    cin>>s;
    for(int i=0;i<s.length();i++)
    {
        if(flag)
        if(s[i]=='2')
        {
            flag=false;
            k=i;
        }
        if(s[i]=='1') ans1+='1';
        if(flag&&s[i]=='0') ans2+='0';
    }
    cout<<ans2+ans1;
    if(!flag)
    {
    for(int i=k;i<s.length();i++)
    {
        if(s[i]!='1')
        cout<<s[i];
    }
    }
    printf("\n");
 } 
View Code

 

posted @ 2020-03-07 16:31  地球长大的赛亚人  阅读(147)  评论(0编辑  收藏  举报