小弟不才,比赛时只做出3道。
Codeforces Round #205 (Div. 2) A. Domino
容易得出结论最多只需交换1次。。。。
代码:
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int a[120],b[120];
int an,bn;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
an+=a[i],bn+=b[i];
}
if(an%2==0 && bn%2==0) {puts("0"); return 0;}
else if((an+bn)%2==1) {puts("-1"); return 0;}
for(int i=1;i<=n;i++){
if((a[i]+b[i])%2==1) {puts("1"); return 0; }
}
puts("-1"); return 0;
return 0;
}
Codeforces Round #205 (Div. 2) B. Two Heaps
一切尽在代码中。。。有时间在写解释。。
代码:
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int a[300];
int put[300]; //安放位置
int n1,n2;
int cnt[300]; //统计数量
int flag[300]; // 标记
int sum,n;
int main()
{
scanf("%d",&n); n<<=1;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
cnt[a[i]]++;
if(cnt[a[i]]>2) continue;
sum++;
}
int u=sum/2, v=sum-u;
printf("%d\n",u*v);
bool OK=false;
while(!OK) //先分配出现次数大于1的, 尽量保持数量均衡
{
int sig=0,i;
for(i=1;i<=n;i++)
{
if(!flag[i] && cnt[a[i]] >= 2) { sig=a[i] ;break; }
}
if(i>n) {OK=true; break; }
for(int i=1;i<=n;i++)
{
if(a[i]==sig)
{
flag[i]=1;
if(n1<n2) { put[i]=1; n1++; }
else { put[i]=2; n2++; }
}
}
}
for(int i=1;i<=n;i++)
{
if(flag[i]) continue;
flag[i]=1;
if(n1<n2){ put[i]=1; n1++; }
else { put[i]=2; n2++; }
}
printf("%d",put[1]);
for(int i=2;i<=n;i++) printf(" %d",put[i]);
return 0;
}
Codeforces Round #205 (Div. 2) C. Find Maximum
数位dp。。
代码:
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long LL;
const int INF=0x7f7f7f7f;
int dp[100050][2]; //dp[i][1] 表示现有所有数位等于m dp[i][0] -----存在小于
int n,a[100050];
char s[100050];
bool flag[100050]; //标记是否出现小于
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
scanf("%s",s);
for(int i=n-1;i>=0;i--)
{
if(s[i]=='1')
{
dp[i][1] = dp[i+1][1]+a[i];
if(flag[i+1]) dp[i][0] = max(dp[i+1][1],dp[i+1][0]+a[i]);
else dp[i][0]=dp[i+1][1],flag[i]=true;
}
else
{
dp[i][1] = dp[i+1][1];
if(flag[i+1]) dp[i][0] = dp[i+1][0] + a[i];
}
if(flag[i+1]) flag[i]=true;
}
printf("%d\n",max(dp[0][0],dp[0][1]));
return 0;
}
Codeforces Round #205 (Div. 2) D. Queue
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char s[1000050];
int main()
{
int n,p=0,ans=0,m=0;
scanf("%s",s);
n=strlen(s);
while(s[p]=='F') p++;
for(int i=p;i<n;i++)
{
if(s[i]=='M') m++;
if(s[i]=='F') ans=max(ans+1,m);
}
printf("%d\n",ans);
return 0;
}