1. 程式人生 > >【Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)】 A.B.C.D

【Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)】 A.B.C.D

前言

在晚上的div2之前開啟的這場,但是自己頭腦貌似不太清醒,全程在寫bug,而且B題不知道自己在寫啥,寫了一百多行?,C也寫了好多bug導致最後的D一眼思路但是沒寫完。希望晚上狀態不要這麼差!QWQ


A. Golden Plate

題意

給你一個h*w的長方形邊框,每減小一次h-=4,w-=4,問從當前大小減小k-1次,
總的周長是多少

做法

直接模擬

程式碼

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int vis[105]; int vis2[105]; int main() { int n,x,y; scanf("%d",&n); scanf("%d",&x); while(x--) { scanf("%d",&y); vis[y]=1; } for(int i=1;i<=n-1;i++) { scanf("%d",&x); for(int j=1;j<=100;j++) vis2[j]=0; while(x--
) { scanf("%d",&y); vis2[y]=1; } for(int j=1;j<=100;j++) { if(vis[j]&&vis2[j]) vis[j]=1; else vis[j]=0; } } for(int i=1;i<=100;i++) if(vis[i]) printf("%d ",i); printf("\n"); return 0; }

B. Curiosity Has No Limits

題意

題意就是給你一個A序列和一個B序列
讓你構造一個t序列,t序列滿足
a i = t i t i + 1 a_i=t_i|t_{i+1}
b i = t i b_i=t_i & t i + 1 t_{i+1}

做法

賽中自己沒什麼想法,於是就寫了個dp
dp[i][j]表示第i個位置放j是否合法,之後就暴力跑就可以了

程式碼

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
int dp[maxn][4];
int pre[maxn][4];
int t[maxn];
int a[maxn],b[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n-1;i++) scanf("%d",&b[i]);
    for(int i=0;i<=3;i++) dp[1][i]=1;
    int flag=0;
    for(int i=2;i<=n;i++)
    {
        if(a[i-1]==0)
        {
            if(b[i-1]==0)
            {
                if(dp[i-1][0])
                {
                    pre[i][0]=0;
                    dp[i][0]=1;
                }
            }
            else
            {
                flag=1;
                break;
            }
        }
        else if(a[i-1]==1)
        {
            if(b[i-1]==2||b[i-1]==3)
            {
                flag=1;
                break;
            }
            else if(b[i-1]==0)
            {
                if(dp[i-1][0])
                {
                    pre[i][1]=0;
                    dp[i][1]=1;
                }
                if(dp[i-1][1])
                {
                    pre[i][0]=1;
                    dp[i][0]=1;
                }
            }
            else
            {
                if(dp[i-1][1])
                {
                    pre[i][1]=1;
                    dp[i][1]=1;
                }
            }
        }
        else if(a[i-1]==2)
        {
            if(b[i-1]==1||b[i-1]==3)
            {
                flag=1;
                break;
            }
            else if(b[i-1]==0)
            {
                if(dp[i-1][0])
                {
                    pre[i][2]=0;
                    dp[i][2]=1;
                }
                if(dp[i-1][2])
                {
                    pre[i][0]=2;
                    dp[i][0]=1;
                }
            }
            else
            {
                 if(dp[i-1][2])
                 {
                     pre[i][2]=2;
                     dp[i][2]=1;
                 }
            }
        }
        else
        {
            if(b[i-1]==0)
            {
                if(dp[i-1][0])
                {
                    pre[i][3]=0;
                    dp[i][3]=1;
                }
                if(dp[i-1][1])
                {
                    pre[i][2]=1;
                    dp[i][2]=1;
                }
                if(dp[i-1][2])
                {
                    pre[i][1]=2;
                    dp[i][1]=1;
                }
                if(dp[i-1][3])
                {
                    pre[i][0]=3;
                    dp[i][0]=1;
                }
            }
            else if(b[i-1]==1)
            {
                if(dp[i-1][1])
                {
                    pre[i][3]=1;
                    dp[i][3]=1;
                }
                if(dp[i-1][3])
                {
                    pre[i][1]=3;
                    dp[i][1]=1;
                }
            }
            else if(b[i-1]==2)
            {
                if(dp[i-1][2])
                {
                    pre[i][3]=2;
                    dp[i][3]=1;
                }
                if(dp[i-1][3])
                {
                    pre[i][2]=3;
                    dp[i][2]=1;
                }
            }
            else
            {
                if(dp[i-1][3])
                {
                    pre[i][3]=3;
                    dp[i][3]=1;
                }
            }
        }
    }
    int tt=0;
    for(int i=0;i<=3;i++)
    {
        if(dp[n][i]) tt=1;
    }
    if(flag==1||tt==0)
    {
        printf("NO\n");
        return 0;
    }
    else
    {
        for(int i=0;i<=3;i++)
        {
            if(dp[n][i]) t[n]=i;
        }
        for(int i=n-1;i>=1;i--)
        {
            t[i]=pre[i+1][t[i+1]];
        }
        printf("YES\n");
        for(int i=1;i<=n;i++) printf("%d ",t[i]);
    }
    return 0;
}


C. Cram Time

題意

給你兩個數a,b,用a,b分別構造兩個序列A,B,
要求A序列的和小於a,B序列的和小於b
而且A序列中和B序列中每個數最多在兩個序列中出現一次
要是最終的兩個序列的長度和最大,輸出兩個序列

做法

a + b 1 + 2 + 3 + . . . + n 判斷出a+b能夠造的的最大的1+2+3+...+n
如果a+b>=(1+2+3+…n),一定可以構造出(1+2+3+…n)
至於構造方法,就先用a,b中大的數從大到小選,再用小的從大到小選,就OK了!

程式碼

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll a,b;
vector<int> v1,v2;
int vis[maxn];
int main()
{
    scanf("%lld%lld",&a,&b);
    ll sum=a+b;
    ll pos=0;
    for(ll i=0;;i++)
    {
        if((1LL*i*(i+1))/2==sum)
        {
            pos=i;
            break;
        }
        else if((1LL*i*(i+1))/2>sum)
        {
            pos=i-1;
            break;
        }
    }
    ll maxx=max(a,b);
    ll minn=min(a,b);
    ll tmp=sum-(1LL*pos*(pos+1))/2;
    for(int i=pos;i>=1;i--)
    {
        if(maxx>=i)
        {
            v1.push_back(i);
            maxx-=(i);
            vis[i]=1;
        }
    }
    for(int i=pos;i>=1;i--)
    {
        if(vis[i]) continue;
        if(minn>=i)
        {
            v2.push_back(i);
            vis[i]=1;
            minn-=i;
        }
    }
    
            
           

相關推薦

Codeforces Round #528 (Div. 1, based on Technocup 2019 Elimination Round 4) 自閉記

  整天自閉。   A:有各種討論方式。我按橫座標排了下然後討論了下縱座標單調和不單調兩種情況。寫了15min也就算了,誰能告訴我printf和cout輸出不一樣是咋回事啊?又調了10min啊? #include<iostream> #include<cstdio

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) C. Cram Time 貪心

C. Cram Time 題意 給你兩個數a,b,用a,b分別構造兩個序列A,B, 要求A序列的和小於a,B序列的和小於b 而且A序列中和B序列中每個數最多在兩個序列中出現一次 要是最終的兩個序列的長度和最大,輸出兩個序列 做法

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum pathdp+滾動陣列

D. Minimum path 題意 給你一個字元矩陣,起點在左上角,每次可以向右或者向下走,可以改變這個字元矩陣中的k個字元,是這個路徑構成的字串字典序最小。 做法 由於可以改變k個字元,那麼肯定是找到一條路徑,前面至少有k項為a, 後面按照字典序選擇路徑就可以。 所

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) A.B.C.D

前言 在晚上的div2之前開啟的這場,但是自己頭腦貌似不太清醒,全程在寫bug,而且B題不知道自己在寫啥,寫了一百多行?,C也寫了好多bug導致最後的D一眼思路但是沒寫完。希望晚上狀態不要這麼差!QWQ A. Golden Plate 題意 給你一個h*w的長方形邊框,

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path(字典序)

https://codeforces.com/contest/1072/problem/D 題意 給你一個n*n充滿小寫字母的矩陣,你可以更改任意k個格子的字元,然後輸出字典序最小的從[1,1]到[n,n]的路徑(1<=n<=2000) 思路 我的 定義dp[i][j]為

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思維,DP,字串)

#include<bits/stdc++.h>using namespace std;char c[2007][2007];char ans[4007];int s[2007][2007];int main(){    memset(s,-1,sizeof(s));&

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思維,DP,字符串)

bsp mes () print urn getch %d ase etc #include<bits/stdc++.h>using namespace std;char c[2007][2007];char ans[4007];int s[2007][2007

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)

A題  題裡給公式了,所有直接套即可,記得判斷w,h是否小於零 #include <bits/stdc++.h> using namespace std; typedef long

Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 模擬

傳送門:http://codeforces.com/contest/1087/problem/C C. Connect Three time limit per test 1 second memory limit per test 256 me

Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2):D. Minimum path(思維)

D. Minimum path time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard output You are

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) C. Vasya and Golden Ticket

足夠 scan property ++ inter digits pos 通過 題意 C. Vasya and Golden Ticket time limit per test 1 second memory limit per test 256 megabytes

Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)

A. Kitchen Utensils 找到k在餐具中的大倍數 #include<bits/stdc++.h> #include<vector> using namespace std; const int maxn=105; int a[maxn]; int mai

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) A-D題解

比賽傳送門 A. In Search of an Easy Problem 最樸素的解法,掃一邊有木有1。。。。。 #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k;i++) usi

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1)

比賽傳送門 A題.水題 #include<bits/stdc++.h> using namespace std; int main() { int t; scanf("%d",&t); bool flag=false;

Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) B. Vasya and Cornfield

題解 題目大意 n和d 還有m個點的x y座標 問座標是否在(0, d) (d, 0) (n-d, n) (n, n-d)四個點圍城的矩形內 判斷矩形不好判斷 可以判斷是否在四個角的三角形內 不包括邊上 AC程式碼 #include <stdio.h>

Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4)題解

2018-12-24晚小上一波分,這套比賽差點翻車,還好最後15分鐘弄出了C,交C的 時候心裡一點底都沒有,因為C的情況可能超過我的想象,現在看來我的擔心是不 必要的。。。然後倒數20多秒絕殺了D題。。這道題很有自信樣例都沒測直接交果 然也過了,後面的題目都沒時間來得及看。。。賽後補好了。  

Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4)

隨手寫一篇部落格吧0.0 A. Right-Left Cipher 直接模擬,偶數在左邊,奇數在右邊。 #include<iostream> #include<algorithm> #include<cstring> #include<strin

Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4)-A. Right-Left Cipher(模擬)

題目連結:http://codeforces.com/contest/1087/problem/A 題意:給你一個加密後的字串讓你解密。加密的過程是 思路:從中間開始向兩邊輸出,如果是偶數再多輸出一位。   #include<bits/stdc++.h> u

(AB)Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round

A. Right-Left Cipher time limit per test 1 second memory limit per test 256 megabytes input standard inp

Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) D Minimum Diameter Tree

題目:Minimum Diameter Tree 思路: 可以把s儘量平均的分配給葉子節點所連的邊,直徑就是這個平局值*2。 給出兩組也許有用的資料: Input: 2 2 1 2 Output: 2 Input: 12 1000 1 2 1 3 1 4 1