Codeforces Round #134 (Div. 2)
这次cf竟然在下午3:00开始,非常开心的注册然后就悲剧了,开始第二题,第三题都是很快的1A,然后看第一题,交上去判了我一个莫名其妙的错误,Idleness limit exceeded on pretest 8,然后我以为我题意理解错了,各种看题……实在没看出来第一题,错在哪了,我又直接看第四题,写了个dfs()虽然我知道这样肯定超时,样例都过了,后来自己输入了10^6的数据直接爆炸了,算了……后来又看第一题,交了,又错了,这次判我RE,才发现我数组开小了,晕倒……
前三题都是水题
A题
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int a[210];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)==2){
for(int i=1;i<=2*n+1;i++)
scanf("%d",&a[i]);
printf("%d",a[1]);
for(int i=2;i<=2*n+1;i++)
if(i%2) cout<<" "<<a[i];
else{
if(k){
if(a[i]>a[i-1]+1&&a[i]>a[i+1]+1) cout<<" "<<a[i]-1,k--;
else cout<<" "<<a[i];
}
else cout<<" "<<a[i];
}
cout<<endl;
}
return 0;
}
B题,直接很裸地暴力
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int a[1010],b[1010];
int main()
{
int n,m,ans1=0,ans2=0;
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>a[i],b[i]=a[i];
for(int i=0;i<n;i++)
{
int Max=-1,k;
for(int j=0;j<m;j++)
if(a[j]&&Max<a[j]) Max=a[j],k=j;
ans1+=Max;
a[k]--;
}
for(int i=0;i<n;i++)
{
int Min=999999,k;
for(int j=0;j<m;j++)
if(b[j]&&Min>b[j]) Min=b[j],k=j;
ans2+=Min;
b[k]--;
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
C题,找联通的有几个部分就行了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int x[1010],y[1010],vis[1010],n;
void dfs(int u)
{
vis[u]=1;
for(int i=1;i<=n;i++)
if(!vis[i]&&(x[i]==x[u]||y[i]==y[u])) dfs(i);
}
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
memset(vis,0,sizeof(vis));
int ans=0;
for(int i=1;i<=n;i++)
if(!vis[i]) ans++,dfs(i);
printf("%d\n",ans-1);
}
return 0;
}
D题 如果正着想不好想,但是倒着想就好想了……因为如果知道 (a,b) 她的前一个状态也就确定了
比赛的时候没想出来,看的别人的代码,自己的水平太差直接贴别人的神代码吧!
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
#include <sstream>
#include <cmath>
#include <queue>
using namespace std;
#define SIZE(x) ((int)s.size())
#define PB push_back
int n;
int k;
int ansLen = 1 << 29;
char ans[1111111];
char a[1111111];
void go(int x, int y)
{
int len = 0;
while(x != y)
{
if (x > y)
{
a[len++] = 'T';
x -= y;
}
else
{
a[len++] = 'B';
y -= x;
}
}
if (x > 1) return;
a[len++] = 'T';
if (len != n) return;
reverse(a, a+len);
int cnt = 0;
for (int i=1; i<len; i++)
if (a[i-1] == a[i]) cnt++;
if (cnt < ansLen)
{
ansLen = cnt;
for (int i=0; i<n; i++) ans[i] = a[i];
}
}
int main(void)
{
cin >> n >> k;
for (int i=1; i<=k; i++)
{
go(i, k);
go(k, i);
}
if (ansLen >= (1 << 29)) cout << "IMPOSSIBLE\n";
else
{
cout << ansLen << '\n';
for (int i=0; i<n; i++)
cout << ans[i];
cout << "\n";
}
return 0;
}