\(\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; }