CodeForces Round #516 Div2 题解

A. Make a triangle!

暴力...

就是给你三个数,你每次可以选一个加1,问最少加多少次能构成三角形

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f 
#define il inline 
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)

inline void read( int &x ){
    x = 0 ; int f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

inline void readl( ll &x ){
    x = 0 ; ll f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

using namespace std ;

#define N 100010

int a , b , c ;

int main(){
    in3( a ,b , c ) ;
    if( a > b ) swap( a , b ) ;
    if( b > c ) swap( b , c ) ;
    if( a > c ) swap( a , c ) ;
    int ans = 0 ;
    while( a + b <= c ) {
        a ++ ; 
        ans ++ ;
        if( a > b ) swap( a , b ) ;
    }
    printf( "%d\n" , ans ) ;
    return  0;
}

B. Equations of Mathematical Magic

求满足式子$a-(a\ xor\ x)-x=0$的$x$值的数量

$a<=2^{30}-1$

对于某一位的$a$和$x$

设$a$这一位上的数字为$a_i$,$x$这一位上的数字为$x_i$

对于$a_i=0$,只有$x_i=0$才成立

对于$a_i=1$,$x_i=0$或者$x_i=1$均成立

所以乘法原理乘一下就好了

ZincSabian聚聚抬了一手(orz我B题就不会了

#include <cstdio>
#include <cstring>
#include <algorithm>

#define ll long long
#define inf 0x3f3f3f3f 
#define il inline 
#define in1(a) readl(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)

inline void read( int &x ){
    x = 0 ; int f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

inline void readl( ll &x ){
    x = 0 ; ll f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

using namespace std ;

#define N 100010

ll T , a ;

int main() {
    in1( T ) ;
    while( T -- ) {
        in1( a ) ;
        ll cnt = 1 ;
        for( int i = 40 ; i >= 0 ; i -- ) {
            if( a&(1ll<<i) ) cnt *= 2ll ;
        }
        printf( "%lld\n" , cnt ) ;
    }
}

C. Oh Those Palindromes

怎么B,C都是结论题啊

C题直接把所有一样的数排在一起就好了...

因为这样确实就能排出最大的回文串了

可以找几个字符串自己写写画画一下,感性理解

#include <cstdio>
#include <cstring>
#include <algorithm>

#define ll long long
#define inf 0x3f3f3f3f 
#define il inline 
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)

inline void read( int &x ){
    x = 0 ; int f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

inline void readl( ll &x ){
    x = 0 ; ll f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

using namespace std ;

#define N 100010

int n ;
char ch[ N ] ;

int main(){
    in1( n ) ;
    scanf( "%s" , ch+1 ) ;
    sort( ch+1 , ch+n+1 ) ;
    printf( "%s" , ch+1 ) ;
}

D. Labyrinth

赛时没调出来...

然后赛后3min调出来

$system\ test$ 完后交了就过了

哭...掉分了

唔...其实这题就是建两个图,对于第一个图只有向左走才会花费代价,对于第二个图只有向右走才会花费代价

然后就是码码码了,我写了$4KB$...

写的$spfa$,网格图居然没卡$spfa$...

代码可能有点丑...

将就着看吧

#include <cstdio>
#include <cstring>
#include <algorithm>

#define ll long long
#define debug printf("233\n")
#define inf 0x3f3f3f3f 
#define il inline 
#define in1(a) read(a)
#define in2(a,b) in1(a),in1(b)
#define in3(a,b,c) in2(a,b),in1(c)
#define in4(a,b,c,d) in2(a,b),in2(c,d)

inline void read( int &x ){
    x = 0 ; int f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

inline void readl( ll &x ){
    x = 0 ; ll f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

using namespace std ;

#define N 2010

int n , m , r , c , x , y ;
char ch[ N ][ N ] ;
struct edge {
    int to , nxt , v ;
} e[ N * N * 4 ] , E[ N * N * 4 ];
int head[ N * N ] , cnt , Head[ N * N ] , Cnt ;
int vis[ N * N ] , d[ N * N ] , Vis[ N * N ] , D[ N * N ] ;
int q[ 1000100 ] ;

void ins1( int u , int v , int w ) {
    e[ ++ cnt ].to = v ;
    e[ cnt ].nxt = head[ u ] ;
    e[ cnt ].v = w ;
    head[ u ] = cnt ;
}

void ins2( int u , int v , int w ) {
    E[ ++ Cnt ].to = v ;
    E[ Cnt ].nxt = Head[ u ] ;
    E[ Cnt ].v = w ;
    Head[ u ] = Cnt ;
}

void spfa() {
    int s = (r-1) * m + c ;
    q[ 1 ] = s ;
    int l = 1 , r = 2 ;
    for( int i = 1 ; i <= n * m ; i ++ ) d[ i ] = inf ;
    d[ s ] = 0 ;
    vis[ s ] = 1 ;
    while( l != r ) {
        int u = q[ l ++ ] ;
        vis[ u ] = 0 ;
        if( l == 1000000 ) l = 1 ;
        for( int i = head[ u ] ; i ;  i = e[ i ].nxt ) {
            int v = e[ i ].to ;
            if( d[ v ] > d[ u ] + e[ i ].v ) {
                d[ v ] = d[ u ] + e[ i ].v ;
                if( !vis[ v ] ) {
                    vis[ v ] = 1 ; 
                    q[ r ++ ] = v ;
                    if( r == 1000000 ) r = 1 ;
                }
            }
        }
    }
}

void spfa2() {
    int s = (r-1) * m + c ;
    int l = 1 , r = 2 ;
    q[ 1 ] = s ;Vis[ s ] = 1 ;
    for( int i = 1 ; i <= n * m ; i ++ ) D[ i ] = inf ;
    D[ s ] = 0 ;
    while( l != r ) {
        int u = q[ l ++ ] ;
        Vis[ u ] = 0 ;
        if( l == 1000000 ) l = 1 ;
        for( int i = Head[ u ] ; i ;  i = E[ i ].nxt ) {
            int v = E[ i ].to ;
            if( D[ v ] > D[ u ] + E[ i ].v ) {
                D[ v ] = D[ u ] + E[ i ].v ;
                if( !Vis[ v ] ) {
                    Vis[ v ] = 1 ; 
                    q[ r ++ ] = v ;
                    if( r == 1000000 ) r = 1 ;
                }
            }
        }
    }
}

int main(){
    in2( n , m ) ;
    in2( r , c ) ;
    in2( x , y ) ;
    for( int i = 1 ; i <= n ; i ++ ) {
        scanf( "%s" , ch[ i ] + 1 ) ;
    }
    for( int i = 1 ; i <= n ; i ++ ) {
        for( int j = 1 ; j <= m ; j ++ ) {
            if( ch[ i ][ j ] == '*' ) continue ;
            if(i-1>=1&&ch[i-1][j]=='.') ins1((i-1)*m+j,(i-2)*m+j,0),  ins2((i-1)*m+j,(i-2)*m+j,0);
            if(j-1>=1&&ch[i][j-1]=='.') ins1((i-1)*m+j,(i-1)*m+j-1,1),ins2((i-1)*m+j,(i-1)*m+j-1,0);
            if(i+1<=n&&ch[i+1][j]=='.') ins1((i-1)*m+j,i*m+j,0),      ins2((i-1)*m+j,i*m+j,0);
            if(j+1<=m&&ch[i][j+1]=='.') ins1((i-1)*m+j,(i-1)*m+j+1,0),ins2((i-1)*m+j,(i-1)*m+j+1,1);
        }
    }
    spfa() ;
    spfa2() ;
    int ans = 0 ;
    for( int i = 1 ; i <= n * m ; i ++ ) {
        if( d[ i ] <= x && D[ i ] <= y ) ans ++ ; 
    }
    printf( "%d\n" , ans ) ;
}

E. Dwarves, Hats and Extrasensory Abilities

这题有点思路,晚上补一下


 

因为题目保证了白的在一边黑的在一边

所以我们可以二分这个分界点

然后输出的时候,纵坐标随便找两个,尽量让他们连线与坐标轴成45度角那样子

反正不要太歪,我取的纵坐标是$0$和$2$

就是真的很不习惯交互的形式

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f 
#define il inline 
#define in1(a) readl(a)

inline void readl( ll &x ){
    x = 0 ; ll f = 1 ; char c = getchar() ;
    while( c < '0' || c > '9' ) {
        if( c == '-' ) f = -1 ;
        c = getchar() ;
    }
    while( c >= '0' && c <= '9' ) {
        x = (x << 1) + (x << 3) + c - 48 ;
        c = getchar() ;
    }
    x *= f ;
}

using namespace std ;

#define N 100010

ll n ;
ll x , y ;
char s[ N ] ;

int main() {
    in1( n ) ;
    puts( "0 0" ) ;
    fflush( stdout ) ;
    scanf( "%s" , s ) ;
    char tmp = s[ 0 ] ;
    ll l = 1 , r = 1e9 ;
    for( int i = 2 ; i <= n ; i ++ ) {
        ll mid = ( l + r ) >> 1 ;
        printf( "%lld %lld\n" , mid , 1ll ) ;
        fflush( stdout ) ;
        scanf( "%s" , s ) ;
        if( s[ 0 ] == tmp ) l = mid + 1 ;
        else r = mid - 1 ;
    }
    printf( "%lld 0 %lld 2\n" , l , r ) ;
}

 

F. Candies for Children

以后补...

 

转载于:https://www.cnblogs.com/henry-1202/p/CF1064-Solution.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值