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); }
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"); }