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<bits/stdc++.h>
#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 <bits/stdc++.h>
#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 <bits/stdc++.h>
#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 <bits/stdc++.h>
#define maxn 5010
using namespace std ;
int n , m ;
vector<int>v[maxn] ;
vector<int>vis(5010);
vector<pair<int,int> > 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<v[a].size();j++){
    if(vis[v[a][j]] == 1){
      T.push_back({a,v[a][j]});
    }
    if(vis[v[a][j]] == 0) dfs(v[a][j], a);
  }
  vis[a] = 2;  
}


posted @ 2019-09-06 19:22  _L_Y_T  阅读(145)  评论(0编辑  收藏  举报