Codeforces Round #676 (Div. 2) E待補

「樓下一個男人病得要死,那間隔壁的一家唱着留聲機,對面是弄孩子。樓上有兩人狂笑;還有打牌聲。河中的船上有女人哭着她死去的母親。人類的悲歡並不相通,我只以爲他們吵鬧。」ios

A - XORwice

把a和b當作二進制數處理,不難發現只要a,b某位都是1咱們就有辦法把它消掉,不然答案該位必定是a+b(0,1)該位的值url

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{ 
    IO;
    int T=1;
    cin>>T;
    while(T--)
    { 
        int a,b;
        cin>>a>>b;
        int res=0;
        for(int i=30;i>=0;i--)
            if(!(a>>i&1)&&(b>>i&1)||(a>>i&1)&&!(b>>i&1)) 
                res+=1<<i;
        cout<<res<<'\n';
    }
    return 0;
}

B - Putting Bricks in the Wall

咱們只要讓g[1][2]g[2][1]的值相等而且不等於g[n][n-1]g[n-1][n]的值便可,最多操做3步。spa

懶得想了,直接枚舉( 2 4 = 16 2^4=16 24=16),應該有更好寫的寫法。.net

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=210;
char g[N][N];
int main()
{ 
    IO;
    int T=1;
    cin>>T;
    while(T--)
    { 
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>g[i]+1;
        if(g[1][2]=='0'&&g[2][1]=='0'&&g[n][n-1]=='0'&&g[n-1][n]=='0') 
            cout<<2<<'\n'<<1<<' '<<2<<'\n'<<2<<' '<<1<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='0'&&g[n][n-1]=='0'&&g[n-1][n]=='0')
            cout<<1<<'\n'<<2<<' '<<1<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='1'&&g[n][n-1]=='0'&&g[n-1][n]=='0')
            cout<<1<<'\n'<<1<<' '<<2<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='1'&&g[n][n-1]=='0'&&g[n-1][n]=='0')
            cout<<0<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='0'&&g[n][n-1]=='1'&&g[n-1][n]=='0')
            cout<<1<<'\n'<<n-1<<' '<<n<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='0'&&g[n][n-1]=='1'&&g[n-1][n]=='0')
            cout<<2<<'\n'<<2<<' '<<1<<'\n'<<n<<' '<<n-1<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='1'&&g[n][n-1]=='1'&&g[n-1][n]=='0')
            cout<<2<<'\n'<<2<<' '<<1<<'\n'<<n<<' '<<n-1<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='1'&&g[n][n-1]=='1'&&g[n-1][n]=='0')
            cout<<1<<'\n'<<n<<' '<<n-1<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='0'&&g[n][n-1]=='0'&&g[n-1][n]=='1')
            cout<<1<<'\n'<<n<<' '<<n-1<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='0'&&g[n][n-1]=='0'&&g[n-1][n]=='1')
            cout<<2<<'\n'<<1<<' '<<2<<'\n'<<n<<' '<<n-1<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='1'&&g[n][n-1]=='0'&&g[n-1][n]=='1')
            cout<<2<<'\n'<<1<<' '<<2<<'\n'<<n-1<<' '<<n<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='1'&&g[n][n-1]=='0'&&g[n-1][n]=='1')
            cout<<1<<'\n'<<n-1<<' '<<n<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='0'&&g[n][n-1]=='1'&&g[n-1][n]=='1')
            cout<<0<<'\n';
        else if(g[1][2]=='1'&&g[2][1]=='0'&&g[n][n-1]=='1'&&g[n-1][n]=='1')
            cout<<1<<'\n'<<1<<' '<<2<<'\n';
        else if(g[1][2]=='0'&&g[2][1]=='1'&&g[n][n-1]=='1'&&g[n-1][n]=='1')
            cout<<1<<'\n'<<2<<' '<<1<<'\n';
        else    
            cout<<2<<'\n'<<1<<' '<<2<<'\n'<<2<<' '<<1<<'\n';
    }
    return 0;

C - Palindromifier

a b c d e f → ( e d c b ) a b c d e f → e d c b a b c d e f ( e d c b a ) → e d c b a b c d e f e d c b a ( b c d e ) abcdef \to (edcb)abcdef\to edcbabcdef(edcba)\to edcbabcdefedcba(bcde) abcdef(edcb)abcdefedcbabcdef(edcba)edcbabcdefedcba(bcde)
只要三步直接搞出來,能夠配合代碼和上述例子食用
debug

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{ 
    IO;
    int T=1;
    //cin>>T;
    while(T--)
    { 
        string s;
        cin>>s;
        int n=s.size();
        cout<<3<<'\n';
        cout<<"L "<<n-1<<'\n';
        cout<<"R "<<n-1<<'\n';
        cout<<"R "<<2*n-1<<'\n';
    }
    
    return 0;
    
}

D - Hexagons

六個方向分別讓座標的變化:
c 1 : ( x + 1 , y + 1 ) c_1:(x+1,y+1) c1:(x+1,y+1)
c 2 : ( x , y + 1 ) c_2:(x,y+1) c2:(x,y+1)
c 3 : ( x − 1 , y ) c_3:(x-1,y) c3:(x1,y)
c 4 : ( x − 1 , y − 1 ) c_4:(x-1,y-1) c4:(x1,y1)
c 5 : ( x , y − 1 ) c_5:(x,y-1) c5:(x,y1)
c 6 : ( x + 1 , y ) c_6:(x+1,y) c6:(x+1,y)





code

不難發現操做 c 2 + c 6 = c 1 c_2+c_6=c_1 c2+c6=c1 c 3 + c 5 = c 4 c_3+c_5=c_4 c3+c5=c4
所以從兩方面考慮是否使用 c 1 c_1 c1 c 4 c_4 c4操做
若是不使用那麼只經過單獨進行橫座標±1和縱座標±1到達目的地直接算便可。
若是使用那麼首先使得最終向x座標和向y座標移動的步數(dx=dy)相等,因而考慮先經過橫座標±1或者縱座標±1操做使最終dx=dy,而後再經過 c 1 c_1 c1或者 c 4 c_4 c4操做使之到達目的地。
不過注意等效操做 c 2 + c 6 = c 1 c_2+c_6=c_1 c2+c6=c1 c 3 + c 5 = c 4 c_3+c_5=c_4 c3+c5=c4取代價更小的。



ci

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll c[10];
int main()
{ 
    IO;
    int T=1;
    cin>>T;
    while(T--)
    { 
        ll x,y;
        cin>>x>>y;
        for(int i=1;i<=6;i++) cin>>c[i];
        ll res=8e18;ll now=0;
        // +x 6
        // -x 3
        // +y 2
        // -y 5
        // 不用c1和c4
        if(x>=0&&y>=0)
            now=c[6]*x+c[2]*y;
        else if(x>=0&&y<0)
            now=c[6]*x+c[5]*(-y);
        else if(x<0&&y>=0)
            now=c[3]*(-x)+c[2]*y;
        else
            now=c[3]*(-x)+c[5]*(-y);
        res=min(res,now);
        // 使用c1和c4
        if(x>y)
        { 
            now=0;
            now+=c[5]*(x-y);
            
            if(x>=0) now+=min(c[1],c[2]+c[6])*x;
            else now+=min(c[4],c[3]+c[5])*(-x);
            res=min(res,now);
            now=0;
            now+=c[6]*(x-y);
            if(y>=0) now+=min(c[1],c[2]+c[6])*y;
            else now+=min(c[4],c[3]+c[5])*(-y);
            res=min(res,now);
        }
        else
        { 
            now=0;
            now+=c[3]*(y-x);
            if(y>=0) now+=min(c[1],c[2]+c[6])*y;
            else now+=min(c[4],c[3]+c[5])*(-y);
            res=min(res,now);
            now=0;
            now+=c[2]*(y-x);
            if(x>=0) now+=min(c[1],c[2]+c[6])*x;
            else now+=min(c[4],c[3]+c[5])*(-x);
            res=min(res,now);
        }
        cout<<res<<'\n';
    }
    return 0;
}

吐槽一波,這題debug了半天居然是上限搞小了,本身通常開 1 0 18 10^{18} 1018結果有數據的答案比該值還大,最終把最大值開到 8 × 1 0 18 8×10^{18} 8×1018才過的。。。get

剛剛看了一波別人的題解,發現D題只須要把全部等效操做的代價取個最小值便可,不必這樣討論,嗨本身仍是太菜了string

E - Swedish Heroes

這題好像是dp,之後回補的!it

最近學業壓力有點重,並且快期中考試了。。。這週六還有校賽,但願能打出好成績。

相關文章
相關標籤/搜索