http://codeforces.com/contest/519
C - A and B and Team Training——暴力/模拟
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
//#ifndef ONLINE_JUDGE
//freopen("in.cpp","r",stdin);
//#endif // ONLINE_JUDGE
scanf("%d%d",&n,&m);
if(n>=m*2) printf("%d\n",m);
else if(m>=n*2) printf("%d\n",n);
else printf("%d\n",(n+m)/3);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int cal(int n, int m){
int res = 0;
for (int i = 1; i <= n; i++) {
int tn = min(i, m/2);
int tm = m - tn*2;
int t = min((n-i)/2, tm);
res = max(res, tn+t);
}
return res;
}
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
printf("%d\n", max(cal(n, m), cal(m, n)));
}
return 0;
}
D - A and B and Interesting Substrings——map
给定一个字符串,求满足某个字串的开头结尾相同,中间的权值和为0的字串的个数
map[i] [j] 表示字母为i前缀和为j的个数,一边计算一边维护就OK了
#include<bits/stdc++.h>
#define ll long long
const int maxn=100005;
using namespace std;
map<ll,ll> mp[26];
ll x[26];
char s[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.cpp","r",stdin);
#endif // ONLINE_JUDGE
for(int i=0;i<26;++i) scanf("%I64d",&x[i]);
scanf("%s",s);
int l=strlen(s);
ll k=0;
ll res=0;
for(int i=0;i<l;++i){
res+=mp[s[i]-'a'][k];
k+=x[s[i]-'a'];
mp[s[i]-'a'][k]++;
}
printf("%I64d\n",res);
return 0;
}