USACO测试赛2
1.奶牛唱歌
将每个字母在奶牛字母表中的顺序打出来,遍历时如果第i个字符在第i-1个字符前面的话,就要再唱一遍,否则不需要。
#include <bits/stdc++.h>
using namespace std;
string s,st;
map<char,int> vh;
int ans=1;
int main(){
freopen("herd.in","r",stdin);
freopen("herd.out","w",stdout);
cin >> s >> st;
int len=s.size(),l=st.size();
for(int i=0;i<len;++i)
vh[s[i]]=i;
for(int i=1;i<l;++i){
if(vh[st[i]]<=vh[st[i-1]])
ans++;
}
cout << ans << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
2.照片分组
分类讨论
我们先讨论两种简单的情况:
1.当偶数的个数等于奇数的个数时,那么结果一定是偶数的个数+奇数的个数,因为直接一个偶配一个奇就可以了。
2.当偶数的个数大于奇数的情况时,前面可以做到一个偶配一个奇,而后面多出来的部分则必须全部相加,合成一个偶数才可以,结果就是偶数的个数*2+1。
然后讨论一种比较复杂的情况:
当奇数的个数大于偶数的个数时,前面的部分同样可以直接配对,而后面的部分就需要三个分成一队,先两个奇数合成一个偶数,再用一个奇数,然后反复即可。如果多出来的部分%3余1的话,就无法正好分配,这时用一个奇数和一个偶数合成一个奇数,就可以避开这个问题。
那么最后的结果除去前面的正好分配,剩下的部分如果是3的倍数的话,乘2即可,否则要再加上一个1.
#include <bits/stdc++.h>
using namespace std;
int n,a[1010];
vector<int> odd;
vector<int> even;//可以不用存,维护个数就行了
int main(){
freopen("group.in","r",stdin);
freopen("group.out"