CF1217

\(\color{red}{A}\color{yellow}{C}\color{blue}{r}\color{green}{e}\color{pink}{a}\color{orange}{t}\color{purple}{i}\color{grey}{n}\color{red}{g}\color{brown}{a}\color{golden}{C}\color{yellow}{h}\color{silver}{a}\color{light blue}{r}\color{pea green}{a}\color{moon blue}{c}\color{doe}{t}\color{puce}{e}\color{red}{r}\)

代码

#include
#define int long long
using namespace std;
signed main(){
    int T ;
    cin >> T ;
    while(T--) {
        int n , m , k ;
        cin >> n >> m >> k ;
        if (k == 0) {
            if(n > m)
                puts("1") ;
            else 
                puts("0") ;
            continue;
        }
        if(m + k - n < 0 ) {
            cout << k+1 << endl ;
            continue;
        }
        int A = min(k+1,(k+1)-max(0ll,((m+k-n)/2+1))) ;
        if ( A < 0 ) 
            A = 0;
        cout << A << endl ; 
    }
    return 0;
} 

\(\color{green}{B Zmei Gorynich}\)

思路 :

记录最大伤害值和最大真实伤害值,判断一次打死和最后一次全血打死的情况

代码

#include 
#define int long long 
using namespace std ;
int T , n , m ;
signed main () {
    cin >> T ;
    while(T --) {
        cin >> n >> m ;
        int attack = - 9999999999 ;
        int rest = -9999999999 ;
        for(int i = 1 ; i <= n ; i ++) {
            int x  , y ;
            cin >> x >> y ;
            attack = max(x,attack) ;
            rest = max(rest,x-y) ;
        }
        if(attack >= m) puts("1") ;
        else if(rest <= 0) puts("-1") ;
        else {
            int ans = 0 ;
            ans += (m-attack) / rest ;
            if(ans*rest < m - attack) ans += 2 ;
            else ans ++ ;   
            cout << ans << endl ;
        }
        
    }
    return 0 ;
}

\(\color{blue}{C The Number Of Good Substrings}\)

思路 :

容易发现,一段区间中,第一个1之前的零都是没什么用的,所以,我们可以在读入的时候进行处理,每次读到一个一的时候,就处理这一小段区间
并找出这个区间之前零的个数(区间第一个一之前的零可以充当白给小队来凑数),然后以这个一为首(准确的说是以这个一以及之前的零为首)
到结尾枚举区间,如果区间长度+0的个数>=十进制数,那么就加一(因为前面白给的0可以加上也可以不加)

代码

#include 
#define maxn 250000
using namespace std ;
int T;
string s ;
int main () {
    cin >> T ;
    while(T --) {
        cin >> s ;
        int ans = 0 ;
        for(int i = 0 ; i < s.size() ; i ++) {
            if(s[i] == '0') continue ;
            int z = 0 ;
            for(int j = i-1 ; j >= 0 ; j --) {
                if(s[j] == '0') z ++ ;
                else break ;
            }
            int val = 0 ;
            for(int j = i ; j < s.size() ; j ++) {
                val = val * 2 + (s[j]-'0') ;
                if(j-i+1+z >= val && val >= j-i+1) {
                    ans ++ ;
                }
                if(val > s.size() ) break ;
            }
        }
        cout << ans << endl ;
    }
    return 0 ;
}

\(\color{brown}{DColoring Edges}\)


#include 
#define maxn 5010
using namespace std ;
int n , m ;
vectorv[maxn] ;
vectorvis(5010);
vector > T , A ;
void dfs(int a ,int p) ;
signed main () {
    cin >> n >> m ;
//  cout << n << " " << m ;
       for (int i = 0; i < m; i ++) {
            int x , y ;
                cin >> x >> y ;
                A.push_back({x,y});
            v[x].push_back(y);
        }

        for (int i = 1; i <= n; i++){
//          puts("*") ;
            if (vis[i] == 0)
//            puts("*") ;
                dfs(i,-1) ;
        }

    if(T.size()==0) {
        puts("1") ;
        for(int i = 0 ; i < m ; i ++) {
            cout << 1 << " " ;
        }
        return 0 ;
    }
    puts("2") ;
    for(int i = 0 ; i < m ; i ++) {
        if(find(T.begin(),T.end(),A[i])!=T.end()) {
            cout << 2 << " " ;
        }else {
            cout << 1 << " "; 
        }
    }
    return 0 ;
}
void dfs(int a, int p){
  vis[a] = 1;  
  for(int j=0;j

你可能感兴趣的:(CF1217)