Codeforces Round #134 (Div. 2)

本文回顾了Codeforces Round #134 (Div. 2)的比赛经历,作者在比赛中遇到了Idleness limit exceeded和Runtime Error的问题,分别在第一题和第四题上。尽管前三题相对简单,但作者在解决第一题和第四题时遇到困难,最终发现并解决了错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值