Codeforces Round #585 (Div. 2) A,B,C,D
题目链接:https://codeforces.com/contest/1215
***************************************************************第A题***************************************************************
思路:过于简单
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 int main() 22 { 23 int a1,a2,k1,k2,n,min1=0,max2=0; 24 cin>>a1>>a2>>k1>>k2>>n; 25 int p=a1*k1+a2*k2-a1-a2; 26 if (n>p){ 27 min1=n-p; 28 if (min1>=a1+a2){ 29 min1=a1+a2; 30 } 31 } 32 if (k1<k2){// 保证第一队罚下一人的需要的黄牌更多 33 int t; 34 t=k1;k1=k2;k2=t; 35 t=a1;a1=a2;a2=t; 36 } 37 int tmp=n,temp=n/k2; 38 if (temp>=a2&&tmp>0){//全下 39 tmp=tmp-k2*a2; 40 max2=max2+a2; 41 if (tmp>=k1){ 42 temp=tmp/k1; 43 max2=max2+min(temp,a1); 44 } 45 } 46 else if (temp<a2&&tmp>0){ //部分下 47 48 max2=max2+temp; 49 } 50 cout<<min1<<" "<<max2<<endl; 51 return 0; 52 }
***************************************************************第B题***************************************************************
思路: 可以寻找包含头元素的子串序列,分别记录子序列乘积大于0和小于0的数量,数量分别为a和b。 那么所有的能乘积为负数的子序列个数为:a*b。
证明:
可以参考前缀和的思想,利用前缀和可以直接遍历到所有的子序列。 至于为什么是a*b,解释为:负数的产生一定是由一个正数和负数相乘所得到。 乘积为正数的序列个数为: (n+1)*n/2-a*b 证明: 因为在区间【1,n】内,分别取 l 和 r ,那么总共的取数为 C(n,2)+ n 这里C(n,2)很好理解就是简单的组合,那为什么还要加n呢?
解释: 在这里 l 和 r 可以取相同的数,即 l=r,所以还需要再加上一个 n 将 C(n,2)+ n 化简即得 :(n+1)* n /2 将所有情况减去负数情况 就是正数情况。 即得证: 正数序列个数为: (n+1)*n/2-a*b
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 int main() 22 { 23 ll n,x,a=0,b=1,tmp=1; 24 scanf("%lld",&n); 25 for (ll i=1;i<=n;i++){ 26 scanf("%lld",&x); 27 if (x<0) 28 tmp*=-1; 29 if (tmp<0) 30 a++; 31 else 32 b++; 33 } 34 printf("%lld %lld\n",a*b,(n+1)*n/2-a*b); 35 return 0; 36 }
***************************************************************第C题***************************************************************
思路:
记录在相同位置下s串为a且t串为b 和 记录s串为b,t串为a 的数量和地址
以s串为a,t串为b情况做例子。
如下图两两进行交换即可,其他类推。
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 char s1[200005],s2[200005]; 22 int main(){ 23 int n; 24 cin>>n; 25 for(int i=1;i<=n;i++) 26 cin>>s1[i]; 27 getchar(); 28 for(int i=1;i<=n;i++) 29 cin>>s2[i]; 30 int num_ab=0,num_ba=0; 31 int ab[200005]={0},ba[200005]={0}; 32 for(int i=1;i<=n;i++){ 33 if(s1[i]=='a'&&s2[i]=='b'){ 34 num_ab++; 35 ab[num_ab]=i; 36 } 37 else if(s1[i]=='b'&&s2[i]=='a'){ 38 num_ba++; 39 ba[num_ba]=i; 40 } 41 } 42 if((num_ab+num_ba)&1) cout<<"-1"<<endl; 43 else{ 44 if(num_ab&1){ 45 cout<<num_ab/2+num_ba/2+2<<endl; 46 for(int i=1;i<num_ab;i+=2) 47 cout<<ab[i]<<" "<<ab[i+1]<<endl; 48 for(int i=1;i<num_ba;i+=2) 49 cout<<ba[i]<<" "<<ba[i+1]<<endl; 50 cout<<ab[num_ab]<<" "<<ab[num_ab]<<endl<<ab[num_ab]<<" "<<ba[num_ba]<<endl; 51 } 52 else{ 53 cout<<(num_ab+num_ba)/2<<endl; 54 for(int i=1;i<=num_ab;i+=2) 55 cout<<ab[i]<<" "<<ab[i+1]<<endl; 56 for(int i=1;i<=num_ba;i+=2) 57 cout<<ba[i]<<" "<<ba[i+1]<<endl; 58 } 59 } 60 return 0; 61 }
***************************************************************第D题***************************************************************
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 #include<algorithm> 11 #define Max(a,b) ((a)>(b)?(a):(b)) 12 #define Min(a,b) ((a)<(b)?(a):(b)) 13 #define Mem0(x) memset(x,0,sizeof(x)) 14 #define Mem1(x) memset(x,-1,sizeof(x)) 15 #define MemX(x) memset(x,0x3f,sizeof(x)) 16 using namespace std; 17 typedef long long ll; 18 const int inf=0x3f3f3f; 19 const double pi=acos(-1.0); 20 21 const int MAXN=2e5+10; 22 int n; 23 char str[MAXN]; 24 int main() 25 { 26 cin>>n>>str+1; 27 int tmp=n/2,a=0,b=0; 28 for (int i=1;i<=tmp;i++){ 29 if (str[i]=='?') 30 a+=9; 31 else 32 a=a+2*(str[i]-'0'); 33 } 34 for (int i=tmp+1;i<=n;i++){ 35 if (str[i]=='?') 36 a-=9; 37 else 38 a=a-2*(str[i]-'0'); 39 } 40 if (a) 41 printf("Monocarp\n"); 42 else 43 printf("Bicarp\n"); 44 return 0; 45 }