Educational Codeforces Round 93 (Rated for Div. 2)(A B C D)
Practice link: https://codeforces.ml/contest/1398
A. Bad Triangle
代码:
1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<string> 7 #include<vector> 8 #include<stack> 9 #include<bitset> 10 #include<cstdlib> 11 #include<cmath> 12 #include<set> 13 #include<list> 14 #include<deque> 15 #include<map> 16 #include<queue> 17 #define ll long long 18 #define MOD 1000000007 19 #define INF 0x3f3f3f3f 20 #define mem(a,x) memset(a,x,sizeof(a)) 21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 using namespace std; 23 const int maxn=1000005; 24 inline int rd() { 25 int res = 0,flag = 0; 26 char ch; 27 if ((ch = getchar()) == '-')flag = 1; 28 else if(ch >= '0' && ch <= '9')res = ch - '0'; 29 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 30 return flag ? -res : res; 31 } 32 int a[50005]; 33 int main() 34 { 35 int T; 36 int n; 37 cin>>T; 38 while(T--){ 39 n=rd(); 40 int x=0; 41 for(int i=1;i<=n;i++){ 42 a[i]=rd(); 43 if(i>2&&a[i]>=a[1]+a[2]&&x==0){ 44 x=i; 45 } 46 } 47 if(x){ 48 printf("1 2 %d\n",x); 49 }else{ 50 printf("-1\n"); 51 } 52 } 53 return 0; 54 }
B. Substring Removal Game
代码:
1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<string> 7 #include<vector> 8 #include<stack> 9 #include<bitset> 10 #include<cstdlib> 11 #include<cmath> 12 #include<set> 13 #include<list> 14 #include<deque> 15 #include<map> 16 #include<queue> 17 #define ll long long 18 #define MOD 1000000007 19 #define INF 0x3f3f3f3f 20 #define mem(a,x) memset(a,x,sizeof(a)) 21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 using namespace std; 23 const int maxn=1000005; 24 inline int rd() { 25 int res = 0,flag = 0; 26 char ch; 27 if ((ch = getchar()) == '-')flag = 1; 28 else if(ch >= '0' && ch <= '9')res = ch - '0'; 29 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 30 return flag ? -res : res; 31 } 32 vector<int>v; 33 bool cmp(int x,int y){ 34 return x>y; 35 } 36 int main() 37 { 38 int T; 39 string s; 40 cin>>T; 41 while(T--){ 42 v.clear(); 43 cin>>s; 44 int k=0; 45 for(int i=0;i<s.size();i++){ 46 if(s[i]=='1'){ 47 k++; 48 }else{ 49 v.push_back(k); 50 k=0; 51 } 52 } 53 if(k!=0)v.push_back(k); 54 sort(v.begin(),v.end(),cmp); 55 ll sum=0; 56 for(int i=0;i<v.size();i+=2){ 57 sum+=v[i]; 58 } 59 cout<<sum<<endl; 60 } 61 return 0; 62 }
C. Good Subarrays
题意:求一个字符串中符合 这个条件的子串的数量。
思路:我们可以把每个元素都减一,那么问题就转化成了一个字符串中有多少个和为 0 的子串,对于这个问题自然而然想到前缀和,就是如果两个前缀和相等,就说明这个子串的和为 0,所以我们可以记录从 1~n 的所有前缀和的数量,然后每次碰到相同的前缀和,就加上前面部分字符串中拥有这个前缀和的数量。
代码:
1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<string> 7 #include<vector> 8 #include<stack> 9 #include<bitset> 10 #include<cstdlib> 11 #include<cmath> 12 #include<set> 13 #include<list> 14 #include<deque> 15 #include<map> 16 #include<queue> 17 #define ll long long 18 #define MOD 1000000007 19 #define INF 0x3f3f3f3f 20 #define mem(a,x) memset(a,x,sizeof(a)) 21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 using namespace std; 23 const int maxn=1000005; 24 inline int rd() { 25 int res = 0,flag = 0; 26 char ch; 27 if ((ch = getchar()) == '-')flag = 1; 28 else if(ch >= '0' && ch <= '9')res = ch - '0'; 29 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 30 return flag ? -res : res; 31 } 32 /* 33 int head[maxn]; 34 int num=0; 35 struct edg{ 36 int next,to,w; 37 }edge[maxn]; 38 void add_edge(int u,int v,int w) 39 { 40 num++; 41 edge[num].next=head[u];edge[num].to=v;edge[num].w=w;head[u]=num; 42 edge[++num].next=head[v];edge[num].to=u;edge[num].w=w;head[v]=num; 43 } */ 44 //----------- 45 map<int,int>mp; 46 int num[maxn]; 47 int main() 48 { 49 int T,n; 50 string s; 51 cin>>T; 52 while(T--){ 53 cin>>n; 54 cin>>s; 55 int sum=0; 56 ll ans=0; 57 for(int i=1;i<=n;i++){ 58 num[i]=s[i-1]-'0'-1; 59 } 60 mp.clear(); 61 mp[0]=1; 62 for(int i=1;i<=n;i++){ 63 sum+=num[i]; 64 if(mp[sum])ans+=mp[sum],mp[sum]++; 65 else mp[sum]++; 66 } 67 printf("%lld\n",ans); 68 } 69 return 0; 70 } 71
D. Colored Rectangles
题意:给你R对红色的木棒,G对绿色的木棒,B对蓝色的木棒,你每次可以选择两对颜色不同的木棒组成一个矩形,问你这些木棒最大可以组成矩形的总面积。
思路:dp题,dp[ r ][ g ][ b ]表示对这三种不同颜色的木棒的选择方式,前面是选择好的dp[ r ][ b ][ g ],比如dp[ r ][ g+1 ][ b+1 ]表示选择了绿色和蓝色的两对木棒,要让面积最大肯定是要选择最大的相乘,所以要对三组木棒从大到小的排序。
转移方程:dp[ x+1 ][ y+1 ][ z ] = max( dp[ x+1 ][ y+1 ][ z ] , dp[ x ][ y ][ z ] + r[ x+1 ] * g[ y+1 ] )
dp[ x ][ y+1 ][ z+1 ] = max( dp[ x ][ y+1 ][ z+1 ] , dp[ x ][ y ][ z ] + g[ y+1 ] * b[ z+1 ] )
dp[ x+1 ][ y ][ z+1 ] = max( dp[ x+1 ][ y ][ z+1 ] , dp[ x ][ y ][ z ] + r[ x+1 ] * b[ z+1 ] )
最后用 ans 和这三个值进行比较即可。
代码:
1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 #include<string> 7 #include<vector> 8 #include<stack> 9 #include<bitset> 10 #include<cstdlib> 11 #include<cmath> 12 #include<set> 13 #include<list> 14 #include<deque> 15 #include<map> 16 #include<queue> 17 #define ll long long 18 #define MOD 1000000007 19 #define INF 0x3f3f3f3f 20 #define mem(a,x) memset(a,x,sizeof(a)) 21 #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 using namespace std; 23 const int maxn=1000005; 24 inline int rd() { 25 int res = 0,flag = 0; 26 char ch; 27 if ((ch = getchar()) == '-')flag = 1; 28 else if(ch >= '0' && ch <= '9')res = ch - '0'; 29 while ((ch = getchar()) >= '0' && ch <= '9')res = (res<<1) + (res<<3) + (ch - '0'); 30 return flag ? -res : res; 31 } 32 int r,g,b; 33 int x[205],y[205],z[205]; 34 ll dp[205][205][205]; 35 bool cmp(int a,int b) 36 { 37 return a>b; 38 } 39 int main() 40 { 41 cin>>r>>g>>b; 42 for(int i=1;i<=r;i++){ 43 x[i]=rd(); 44 } 45 for(int i=1;i<=g;i++){ 46 y[i]=rd(); 47 } 48 for(int i=1;i<=b;i++){ 49 z[i]=rd(); 50 } 51 sort(x+1,x+r+1,cmp); 52 sort(y+1,y+g+1,cmp); 53 sort(z+1,z+b+1,cmp); 54 dp[0][0][0]=0; 55 ll ans=0; 56 for(int i=0;i<=r;i++){ 57 for(int j=0;j<=g;j++){ 58 for(int k=0;k<=b;k++){ 59 dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+x[i+1]*y[j+1]); 60 dp[i][j+1][k+1]=max(dp[i][j+1][k+1],dp[i][j][k]+y[j+1]*z[k+1]); 61 dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]+x[i+1]*z[k+1]); 62 ans=max(ans,max(dp[i+1][j+1][k],max(dp[i+1][j][k+1],dp[i][j+1][k+1]))); 63 } 64 } 65 } 66 cout<<ans; 67 return 0; 68 }