cf419 (div2)3/5

因为这场比赛是在寝室打的,所以写法都挺蠢的。。。不过也是我第一次过了cf5题时的三题,虽然感觉c题是我打的这几场里最简单的c题。

A:用的最蠢的办法

直接+,程序自己判断进位,然后判断回文。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int check(int m,int n)
{
    char s[10],v[10];
    int num = 0;
    s[num++] = m/10+'0', s[num++] = m%10 + '0';
        s[num++] = n/10 +'0', s[num++] = n%10 + '0';
    s[num] = '\0';

    for(int i = 0; i < num; i++)
        v[i] = s[num-i-1];
    v[num] = '\0';
    if(strcmp(s,v) == 0 )return 1;
    else return 0;
}
int main()
{
    int m,n;
    scanf("%d:%d",&m,&n);
    int temp = 0;
    for(int i = 0; i < 2400*60; i++)
    {
        if(check(m,n))
        { temp = i; break;}

        //else n++;
        n++;
        if(n == 60) m++, n = 0;
        if(m == 24) m = 0;
    }
    printf("%d\n", temp);
    return 0;
}


B: 我是用的线段树维护,只能保证不超时,实际上线段树还写搓了一次,tle了,后10分钟我把我的代码锁了去看别人的代码,发现别人的代码意外的简洁,之后会学习。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 2e5+10;
int data[maxn][2];
int num[maxn << 2];
int tag[maxn << 2];
int v[maxn << 2];
int n,k,q;

void add(int al,int ar,int id,int l,int r)
{
    if(ar < l || al > r) return;
    if(l >= al && r <= ar )
    {
        tag[id] += 1;
        num[id] += (r-l+1);
        return;
    }
    int m = l+r>>1;
    if(tag[id])
    {
        num[id << 1] += (m-l+1)*tag[id];
        num[id << 1|1] += (r-m)*tag[id];

        tag[id << 1] += tag[id];
        tag[id << 1 | 1] += tag[id];

        tag[id] = 0;
    }

    if(al <= m) add(al,ar, id<<1,l,m);
    if(ar > m) add(al,ar,id<<1|1,m+1,r);

    num[id] = num[id<<1] + num[id<<1|1];
}


int use(int id,int l,int r)
{
    if(l == r)
    {
        if(num[id] >= k)
            v[id] = 1;
        else v[id] = 0;
        return 1;
    }
    int m = l+r>>1;


    if(tag[id])
    {
        num[id << 1] += (m-l+1)*tag[id];
        num[id << 1|1] += (r-m)*tag[id];

        tag[id << 1] += tag[id];
        tag[id << 1 | 1] += tag[id];

        tag[id] = 0;
    }

    use(id<<1,l,m);
    use(id<<1|1,m+1,r);

    v[id] = v[id<<1] + v[id<<1|1];


}
int qu(int ql,int qr,int id,int l,int r)
{
    if(qr < l || ql > r) return 0;
    if(l >= ql && r <= qr ) return v[id];
    int m = l+r>>1;

    int ans = 0;
    if(ql <= m)  ans += qu(ql,qr,id<<1,l,m);
    if(qr > m) ans += qu(ql,qr,id<<1|1,m+1,r);

    return ans;
}
int main()
{

    scanf("%d%d%d",&n,&k,&q);
    int r = maxn;
    for(int i = 0; i < n ; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b,1,1,r);

        //r = max(r,b);
    }
    r = maxn;
    //for(int i = 0; i < n; i++)
    //    add(data[i][0],data[i][1],1,1,r);

    use(1,1,r);
    for(int i = 0; i < q; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",qu(a,b,1,1,r));
    }
    return 0;
}



C:讲真我自己都是蒙的,不知道自己的思路在哪里,我的做法大致是先看每行的最小值,然后每行减去这个最小值,之后看列。 对列也要进行一遍。在第一遍交的时候被hack了,这个hack也提醒了我行和列如果优先考虑列的情况,如果不是这个hack,我可能直接就去睡觉了。当然这也就导致代码写的特别。。丑。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f3f;
int g[maxn][maxn],h[maxn][maxn],g1[maxn][maxn];
int row[maxn][2],col[maxn][2];
int ansr[maxn][2], ansc[maxn][2];
int main()
{
    //freopen("D://in.txt","r",stdin);
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++)
    for(int j = 1; j <= m; j++)
        scanf("%d",&g[i][j]);
    memcpy(g1,g,sizeof(g));

    int ans1 = 0;
    for(int i = 1; i <= n; i++)
    {
        int imin = inf;
        for(int j = 1; j <= m; j++)
            imin = min(imin,  g[i][j]);
        for(int j = 1; j <= m; j++)
            g1[i][j] -= imin;
        row[i][0] = imin;
        ans1 += imin;
    }
    for(int j = 1; j <= m; j++)
    {
        int imin = inf;
        for(int i = 1; i <= n; i++)
            imin = min(imin, g1[i][j]);
        col[j][0] = imin;
        ans1 += imin;
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
            h[i][j] += row[i][0];
    }
    for(int j = 1 ; j <= m; j++)
    for(int i = 1 ; i <= n; i++)
        h[i][j] += col[j][0];
    int mark = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(h[i][j] != g[i][j])
                {mark = 1;break;}
        }
        if(mark) break;
    }

    int ans2 = 0,flag = 0;
    memcpy(g1,g,sizeof(g));
    memset(h,0,sizeof(h));
    for(int j = 1; j <= m; j++)
    {
        int imin = inf;
        for(int i = 1; i <= n; i++)
            imin = min(imin,  g[i][j]);
        for(int i = 1; i <= n; i++)
            g1[i][j] -= imin;
        col[j][1] = imin;
        ans2 += imin;
    }
    for(int i = 1; i <= n; i++)
    {
        int imin = inf;
        for(int j = 1; j <= m; j++)
            imin = min(imin, g1[i][j]);
        row[i][1] = imin;
        ans2 += imin;
    }

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
            h[i][j] += row[i][1];
    }
    for(int j = 1 ; j <= m; j++)
    for(int i = 1 ; i <= n; i++)
        h[i][j] += col[j][1];
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(h[i][j] != g[i][j])
                {flag = 1;break;}
        }
        if(flag) break;
    }

    if(mark && flag) printf("-1\n");
    else if(!mark && flag)
    {
        cout<<ans1<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][0]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][0]; i++ )
                cout<<"col "<<j<<endl;
    }
    else if(mark && !flag)
    {
        cout<<ans2<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][1]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][1]; i++ )
                cout<<"col "<<j<<endl;
    }
    else
    {
        int id = ans1 > ans2 ? 1 : 0;
        cout<<min(ans1,ans2)<<endl;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j < row[i][id]; j++)
                cout<<"row "<<i<<endl;
        }
        for(int j = 1; j <= m; j++)
            for(int i = 0; i < col[j][id]; i++ )
                cout<<"col "<<j<<endl;
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值