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