Atcoder Regular Contest 081 总结

这场ARC…我打的不是特别好…只A掉了前两题,第三题在最后10分钟想出了一点眉目,结果来不及打了QAQ…
最终排名:rank361,rating+=86.
目前rating:1394(Fighting!!!)

C - Make a Rectangle

题意:给你 n 根木棍,让你选其中的4根组成一个矩形,问矩形能组成的最大面积为多少。
思路&&题解:其实因为木棍不能由两根或多根组成一条边,只需要找到长度相等的木棍,如果该木棍有两根,那就在另一个数组加入一次这种长度,如果有四根,就加两次。最后对那个数组从大到小排序一遍就行了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
map<int,int> s;
int x,n;
ll num[maxn];
int tot=0;
bool cmp(ll a,ll b) {
    return a>b;
}
int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&x);
        s[x]++;
    }
    for(map<int,int>::iterator it=s.begin();it!=s.end();it++) {
        if(it->second>=4) {
            num[++tot]=it->first;
            num[++tot]=it->first;
            continue;
        }
        else if(it->second>=2) {
            num[++tot]=it->first;
        }
    }
    sort(num+1,num+tot+1,cmp); 
    if(tot<2) {
        puts("0");
        return 0;
    }
    else {
        printf("%lld\n",(num[1]*num[2]));
        return 0;
    }
    return 0;
}

D - Coloring Dominoes

题意:给你两串长为 n,(n52) ,表示有 n 个多米诺骨牌,两个相同字母的1×2 2×1 的方格表示一个多米诺骨牌。现在想给他们染色,一共有红,绿,蓝三种颜色可以染,规定相邻的两个多米诺骨牌不能染相同的颜色,求一共有多少种染色的方法。
思路&&题解:设一个竖着放的多米诺骨牌为 X ,两个上下摆放并且横着放的多米诺骨牌为Y,我们可以发现只有 XX,XY,YX,YY 四种情况。
XX 这种情况,后面的 X 一共有两种染色方法;XY这种情况,后面的 Y 有两种染色方法;YX这种情况,后面的 X 只有一种染色方法;YY这种情况,后面的 Y 有三种染色方法。然后直接这样分类讨论下去就行了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=60;
const ll mod=1e9+7;
int n;
char s[3][maxn];
ll sum=1;
int main() {
    scanf("%d",&n);
    for(int i=1;i<=2;i++) {
        scanf("%s",s[i]+1);
    }
    int pos=1,ne=0;
    while(pos<=n) {
        if(pos==1) {
            if(s[1][pos]==s[2][pos]) {
                sum*=3;
                pos++;
                ne=1;
                continue;
            }
            else {
                sum*=6;
                pos+=2;
                ne=2;
            }
            continue;
        }
        if(s[1][pos]==s[2][pos]) {
            sum*=(3-ne);
            ne=1;
            sum%=mod;
            pos++;
            continue;
        }
        else {
            if(s[1][pos-2]==s[1][pos-1]) {
                sum*=3;
                sum%=mod;
                pos+=2;
                ne=2;
                continue;
            }
            sum*=(3-ne);
            sum%=mod;
            ne=2;
            pos+=2;
            continue;
        }
    }
    printf("%lld\n",sum);
}

E - Do not Be a Subsequence

题意:给你一串字符串,求最短的且字典序最小的字符串不是原串的子序列。
思路&&题解:先从后往前预处理出每个位置往后有多少个完整的az,用 res[i] 表示。然后对于 az ,求出每个字符在原串中从前往后第一次出现的位置。再预处理出每个位置在该位置之后的 az 每个字符下次出现的位置,用 nxt[pos][i] 表示。之后就开始大力贪心。枚举第一个字符的位置,然后枚举下一个字符,找到 res[nxt[pos][i]] 最小的字符,再继续往下找直到找到字符串结尾就行了…

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200050;
char s[maxn];
int pos[maxn][26],len,fst[26],res[maxn],tot=0;
bool book[26];
int ans[26][maxn];
int maxx=maxn+1,in;
int main() {
    memset(book,0,sizeof book);
    scanf("%s",s+1);
    len=strlen(s+1);
    for(int i=len;i>=1;i--) {
        fst[s[i]-'a']=i;
        for(int k=0;i<=25;k++) {
            pos[i][k]=(k==s[i]-'a')?i:pos[i+1][k];
            res[i]+=res[i+1]; 
        }
        if(!book[s[i]-'a']) {
            tot++;
            if(tot==26) {
                tot=0;
                memset(book,0,sizeof book);
                res[i-1]++;
            }
        }
    }
    for(int i=0;i<=25;i++) {
        int num=1,po=fst[i],ind;
        ans[i][1]=i;
        while(1) {
            int ma=999;
            bool f=1;
            for(int j=0;j<=25;j++) {
                if(res[pos[po][j]]<ma) {
                    ma=res[pos[po][j]];
                    ind=j;
                    f=0;
                }
            }
            num++;
            ans[i][num]=ind;
            po=pos[po][ind];
            if(f)
                break;
        }
        if(num<maxx) {
            maxx=num;
            in=i;
        }
    }
    for(int i=1;i<=maxx;i++)
        printf("%c",ans[in][i]+'a');
    return 0;
}

F - Flip and Rectangles

题意(转换后的):给你一个 n×m 01 矩阵,每次可以对一列或者一行上的每个数字取反,可以进行多次取反,问你能获得的最大全为 1 <script type="math/tex" id="MathJax-Element-1740">1</script>的矩阵面积为多少。
题解:这题暂时我还不会…先放一放吧qwq

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值