AtCoder Regular Contest 094

AtCoder Regular Contest 094


C - Same Integers

题意:

给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2;2.把任意两个数+1。求最少需要几次操作将三个数变为相同的数。

分析:

可以发现如果三个数的奇偶性相同直接加就可以了,对于奇偶性不同的,先把奇偶性相同的两个数都+1,然后按照相同的处理就可以了。可以证明没有更好的方案。

#include <bits/stdc++.h>
using namespace std;
int a,b,c,flag,ans,maxx;
int main()
{
    cin>>a>>b>>c;
    if(a%2==b%2&&b%2==c%2){
        maxx=max(a,max(b,c));
        ans+=(maxx*3-a-b-c)/2;
    } else {
        maxx=max(a,max(b,c));
        flag=(a%2+b%2+c%2);
        maxx+=(maxx%2==(flag==2));
        ans+=(maxx*3-a-b-c-2)/2;
        ans+=1;
    }
    cout<<ans;
}

D - Worst Case

题意:

给出\(Q\)组询问,每组询问给出两个数\(A_i,B_i\),问有多少个二元组\((x,y)\)使\(x\times y\le A_i\times B_i\),其中每个数最多使用两次。
给出的\(A_i,B_i\)包含在使用次数中。

分析:

可以观察得到小于\(\sqrt{A_i\times B_i}\)的数可以随便组合并且一定保证合法。并且无法找出另一种方式使其比这种分配方式更加优秀。

那么直接计算即可,可以设\(A_i\times B_i\)为\(p\),\(\sqrt{A_i\times B_i}\)为\(l\),那么如果\(l\times(l+1)<p\)的话,\(ans=2\times(l-1)+1\)否则则不\(+1\)。
考虑\(p\)正好为完全平方数的情况,如果\(A_i,B_i\)恰好等于\(l\)则不用管,否则一定会占用其中一个位置,所以需要相应减去1.

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll q,a,b,cnt,p,l;
int main()
{
    cin>>q;
    while(q--){
        cin>>a>>b;
        p=a*b;
        l=sqrt(p);
        if(l*(l+1)<p) cnt=2*(l-1)+1;
        else cnt=2*(l-1);
        if(l*l==p&&a!=b) cnt--;
        if(a*b==4) cnt=1;
        cout<<cnt<<endl;
    }
}

E - Tozan and Gezan

题意:

给出\(a,b\)且\(\sum a=\sum b\)两个数列,A,B两人分别给数列中的数进行-1操作,当序列中的数都相同时停止,A希望轮数尽量多,B希望轮数尽量少,求至少会进行多少轮。

分析:

貌似比上一道题还要简单一些。

观察得出当所有数都一样是,答案是0,当有任何一组数不一样是,假设\(a_i<b_i\)那么就可以一直缩减到0,如果\(a_i>b_i\)那么就可以把另一组数减小到0,因为这一组数肯定是B是无力回天了。

那么直接找到B中最小的那个就可以了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=2e6+7;
ll a[MAXN],b[MAXN],n,sum,minn=1e9+7;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
        sum+=a[i];
        if(a[i]>b[i]) if(minn>b[i]) minn=b[i];
    }
    if(minn==1e9+7) cout<<0<<endl;
    else cout<<sum-minn;
}

F - Normalization

题意:

有一个由abc组成的串,可以选择相邻的两个不同的字符替换成第三种字符,问最多能形成多少种不同的串。

分析:

思考在那些时候字符串S转换不成T。

我们可以将a,b,c看成是数字0,1,2。那么发现,每一次更改都不会改变所有数位之和在%3意义下的值。也就是说T所有数位之和如果与S不同,那么是无法转换的。

如果一开始所有字符都是一样的,那么也就没有什么转换的方法。

可以发现,如果如果T中字符相邻两两不同,那么他是无法被转换而成的。

那么是不是剩下的都可以了呢?

可以通过打表发现,3以内的数据非常奇怪没有规律,但是3以上的符合上述规律。

DP求解即可。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e6+7;
#define mo 998244353
char s[MAXN];
int f[MAXN][3][3][2],n,ans;
inline bool check_all()
{
    for(int i=1;i<=n-1;i++)
        if(s[i]!=s[i+1]) return 0;
    return 1;
}
inline bool check_same()
{
    for(int i=1;i<=n-1;i++)
        if(s[i]==s[i+1]) return 0;
    return 1;
}
int main()
{
    scanf("%s",s+1);
    n=strlen(s+1);
    if(check_all()) {
        cout<<1;
        return 0;
    }
    if(n<=3){
        if(n==2) cout<<2;
        else if(s[1]!=s[2]&&s[2]!=s[3]&&s[1]!=s[3]) cout<<3;
        else if(s[1]==s[3]) cout<<7;
        else cout<<6;
        return 0;
    }
    int tot=0;
    for(int i=1;i<=n;i++)
        tot+=s[i]-'a';
    tot%=3;
    f[1][1][1][0]=f[1][2][2][0]=f[1][0][0][0]=1;
    for(int i=2;i<=n;i++)
        for(int j=0;j<=2;j++)
            for(int k=0;k<=2;k++)
                for(int p=0;p<=2;p++){
                    int last=(j-k+3)%3;
                    (f[i][j][k][1]+=f[i-1][last][p][1])%=mo;
                    if(k==p) (f[i][j][k][1]+=f[i-1][last][p][0])%=mo;
                    else (f[i][j][k][0]+=f[i-1][last][p][0])%=mo;
                }
    for(int i=0;i<=2;i++)
        (ans+=f[n][tot][i][1])%=mo;
    cout<<ans+check_same();
}

原文地址:https://www.cnblogs.com/victorique/p/9589937.html

时间: 2024-10-08 16:58:08

AtCoder Regular Contest 094的相关文章

AtCoder Regular Contest 098

AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定一个位置,使位置左边的字符都变成E,右边都变成W所需要的最小花费. 分析 这题纯粹是签到题,做两个前缀和然后直接加就可以了. #include <iostream> #include <cmath> #include <cstring> #include <cstdi

AtCoder Regular Contest 095

AtCoder Regular Contest 095 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个A和Y个B最小花费使多少. 分析: 明显的发现肯定买性价比更高的方案,分情况讨论一下,如果\(a+b<=2*c\),那么明显的先买足c到A,B中较小的一个,然后再比较一下剩下的那个的单价和\(2*c\)的大小. A[ans=] -->|a+b<=2*c| B(A*a+B*b) A -->

AtCoder Regular Contest 103

AtCoder Regular Contest 103 一些吐槽 参加的第一场\(ARC\):一个模拟 + 三个构造 没见过比这更令人感动的题型设置了(简直就是针对我(TAT)) . 感觉全场就我一个人\(E\)题WA了四遍才过....... C-//// 题目大意: 网址 给定一个串\(S\),要求修改一些字符,使得串满足以下条件: \(S_i = S_{i+2}\) \(S_1 \neq S_2\) . 问最少需要修改多少个字符. 题解: 无脑统计一下奇数和偶数格的每种种类. 然后在最大值和

AtCoder Regular Contest 075 E - Meaningful Mean 树状数组求顺序对, 前缀和

题目链接: http://arc075.contest.atcoder.jp/tasks/arc075_c 题意: 给你一个序列和一个数k,求有多少对l,r,使得a[l]+a[l+1]+...+a[r]的算术平均数大于等于k 1≤N≤2×10^5 1≤K≤10^9 1≤ai≤10^9 思路: 首先对于所有数减去k,这样就不用除(r-l+1), 然后我们发现所求的就是有多少对l,r,使得sum[r]-sum[l-1] >= 0, sum是减去k之后的序列的前缀和 用树状数组对sum求有多少个顺序对

AtCoder Regular Contest 063 E:Integers on a Tree

题目传送门:https://arc063.contest.atcoder.jp/tasks/arc063_c 题目翻译 给你一个树,上面有\(k\)个点有权值,问你是否能把剩下的\(n-k\)个点全部填上权值,使得每条边链接的两个点权值相差\(1\),如果可以做到需要输出任意一组方案. 题解 我们考虑每条边权值为\(1\)或\(-1\),那么相当于黑白染色一样,所有点权值的奇偶性也都是确定的.如果与读入的\(k\)个点中某个点相冲突了就\(GG\).另外每个点的取值范围都可以转化成一段区间\([

AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer

题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号,求选出6块不同的板子,围成的本质不同的合法立方体的个数.一个合法立方体,当且仅当木板有编号的一面在外面,且立方体顶点处的三个颜色相同.由于编号的存在,木板可以有4种形态.两个立方体本质相同,当且仅当存在一种空间旋转方式,使得两个立方体一模一样(包括编号方向) 没想到这题巨暴力--当我们确定对面的两

AtCoder Regular Contest 072 E:Alice in linear land

题目传送门:https://arc072.contest.atcoder.jp/tasks/arc072_c 题目翻译 给你一个数组\(D\),然后给你一个操作序列\(d\),每次操作可以将\(D\)变成\(min(D,|D-d[i]|)\).假如这一个操作序列执行完了之后你的\(D\)变成\(0\)了,那么就称这个操作序列是合法的.现在有\(Q\)个询问,每个询问由一个\(q[i]\)表示,问你假如你可以把\(d[i]\)变成任意正整数,你能否将这个操作序列变成不合法的.\(N,Q\leqsl

AtCoder Regular Contest 101 F

题目链接:atcoder 考虑所有的洞将数轴划分成了若干个区间,则对每个机器人无论他怎么移动都不可能出这个区间,所以每个机器人至多只可能掉入两个洞中 对于最左边和最右边没有洞的机器人,显然他们的掉洞方案唯一,于是我们不去考虑它,对于剩下的机器人,我们用一个二元组\((l_i,r_i)\)表示它到离它最近的左/右边的洞的距离,很明显一个机器人掉入哪个洞只与操作序列达到的最左边/右边的位置有关. 将所有的二元组放在一个平面上,用它们来标记一些点,操作序列的历史达到的最左边/右边的位置可以用一条只会向

AtCoder Regular Contest 083 D:Restoring Road Network

In Takahashi Kingdom, which once existed, there are N cities, and some pairs of cities are connected bidirectionally by roads. The following are known about the road network: People traveled between cities only through roads. It was possible to reach