Codeforces Round #581 (Div. 2)

A.BowWow and the Timetable

题目连接

题目大意

给你一个以二进制方式来表示数字\(n\)的字符串,问\(4^k < n\)数字的个数。

解题思路

题目给的数字是以二进制的方式给的,那么结合二进制数字的特点,可以发现每个\(4^k\)用二进制表示最前面的那个1都是在奇数位置,那么如果给的字符串长度是偶数,直接除以2;如果是奇数的话,加1除以2,并且判断最高位1是否满足条件。

AC代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    bool flag = false;
    int len = s.size();
    int res;
    if(len%2==0){
        res = len/2;
    }else{
        res = (len+1)/2;
        for(int i=1;i<len;i++){
            if(s[i]!='0'){
                flag = true;
            }
        }
        if(!flag)res--;
    }
    cout<<res<<endl;
    return 0;
}

B.Mislove Has Lost an Array

题目链接

题目大意

有大小为\(n\)的一个数组,这个数组中至少有\(l\)个不同的数,至多有\(r\)个不同的数,并且数组中如果有奇数的话,奇数只能是\(1\),否则全是偶数,并且如果数组中有偶数\(a_i\),那么数组中也必须有偶数\(a_i/2\)。求数组所有元素的最大和,最小和。

解题思路

所有元素的和最小,首先必须要满足至少有\(r\)个不同的元素,根据元素的要求,数组中的元素呈现\(1,2,4,8 \cdots,a[i-1]*2\)的规律,先算出\(r\)个不同元素的和,其余元素全部为\(1\);所有元素的和最大,则先算出\(l\)个不同元素的和,其余元素全部为最大的那个元素。

AC代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,l,r;
    cin>>n>>l>>r;
    int minsum=1,maxsum=1;
    int cnt=1;
    for(int i=1;i<l;i++){
        cnt*=2;
        minsum+= cnt;
        maxsum+=cnt;
    }
    for(int i=l;i<n;i++){
        minsum+=1;
    }
    for(int i=l;i<r;i++){
        cnt*=2;
        maxsum+=cnt;
    }
    for(int i=r;i<n;i++){
        maxsum+=cnt;
    }
    cout<<minsum<<" "<<maxsum<<endl;
    return 0;
}

C.Anna,Svyatoslav and Maps

题目连接

题目大意

一个有向无自环图,给定一个序列\(p_1,p_2,p_3,\cdots,p_n\) , 删除序列\(p\)中除\(p_1,p_n\)外的某些点,得到序列\(v_1,v_2,\cdots,v_k\),序列\(v\)必须满足通过这些点的最短路径是序列\(v\),求出最短序列\(v\)。

解题思路

最开始做这道题的时候,切入点错了。应该考虑哪些点应该删除,删除的点必须要满足哪些条件。仔细思考之后发现,假设删除\(p_2\)这个点之后,经过这些点的最短路径依然能够得到原来的序列\(p\),那么说明\(p_2\)是\(p_1\)到\(p_3\)最短路径必须经过的点,即\(p_1\)到\(p_3\)必须要经过\(p_2\),可以省略\(p_2\)的存在。反过来可以得到不是最短路径经过的点必须要存在,否则就存在另一条最短路径。

AC代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
const int maxn = 1e6+5;
const int maxm = 1e2+10;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,m;
int weight[maxm][maxm];
int p[maxn];
bool flag[maxn];
void init()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            char c;
            cin>>c;
            if(c=='0'){
                weight[i][j]=INF;
            }else{
                weight[i][j]=1;
            }
        }
        //注意初始化自环
        weight[i][i]=0;
    }
    cin>>m;
    for(int i=1;i<=m;i++)cin>>p[i];
}
void floyd(){
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                weight[i][j]=min(weight[i][j],weight[i][k]+weight[k][j]);
            }
        }
    }
}
void solve(){
    int t=m;
    int cnt=p[1];
    for(int i = 2 ; i <= m - 1 ; i++) {
        if(weight[cnt][p[i]]+weight[p[i]][p[i + 1]] <= weight[cnt][p[i + 1]]) {
            flag[i] = 1;
            t--;
        }
        else cnt = p[i];
    }
    cout<<t<<endl;
    for(int i = 1 ; i <= m ; i++) {
        if(flag[i])continue;
        cout << p[i] << " ";
    }
}
int main()
{
    ios::sync_with_stdio(false);
    init();
    floyd();
    solve();
    return 0;
}

D1. Kirk and a Binary String (easy version)

题目连接

题目大意

往下滑,看D2

解题思路

往下滑,看D2

AC代码

往下滑,看D2

D2. Kirk and a Binary String (hard version)

题目连接

题目大意

给你一个只包含\(0,1\)字符的字符串\(s\),找到另一个字符串\(t\),要求字符串\(t\)和\(s\)的长度一样,并且任意子区间的最长非递减子序列的长度一样,并且字符\(0\)的个数尽可能的多。

解题思路

先让\(t=s\),肯定满足任意子区间的最长非递减子序列的长度一样,但不满足\(0\)的个数最多,所以可以将字符串\(t\)中的不影响子序列长度的\(1\)转为\(0\)。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int cnt=0;
    string s;
    cin>>s;
    for(int i=s.size()-1;i>=0;i--)
        if(s[i]=='0')cnt++;
        else if(cnt)cnt--;
        else s[i]='0';
    cout<<s<<endl;
}

原文地址:https://www.cnblogs.com/zrcsy/p/12188866.html

时间: 2024-10-12 07:41:29

Codeforces Round #581 (Div. 2)的相关文章

Codeforces Round #581 (Div. 2)-E. Natasha, Sasha and the Prefix Sums-动态规划+组合数学

Codeforces Round #581 (Div. 2)-E. Natasha, Sasha and the Prefix Sums-动态规划+组合数学 [Problem Description] ? 给你\(n\)个\(1\),\(m\)个\(-1\),他们任意排列有\(\frac{(n+m)!}{n!\cdot m!}\)中排列,每种排列都有一个最大前缀和(可能为\(0\)),求所有排列的最大前缀和之和为多少. [Solution] ? 定义\(dp[i][j]\)表示有\(i\)个\(

Codeforces Round #581 (Div. 2)D(思维,构造,最长非递减01串)

#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[100007];int main(){ cin>>s+1; int n=strlen(s+1); int cnt=0; for(int i=n;i>=1;--i){//从后向前,保证后面的解都是合法的情况下 if(s[i]=='1'){//如果当前位置的数字是1 if(cnt)//i后面1的个数小于0的个数,此时如果把i位

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除

Codeforces Round #339 (Div. 2) B. Gena&#39;s Code

B. Gena's Code It's the year 4527 and the tanks game that we all know and love still exists. There also exists Great Gena's code, written in 2016. The problem this code solves is: given the number of tanks that go into the battle from each country, f

Codeforces Round #315 (Div. 1)

A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex and un