标签:detail str flag lan 题解 一个 compress ret root
A.Digits Sequence Dividing
题意:给你一个1-9的数字字符串,把它划分成若干段(>=2)段,使其大小递增。
错误:当长度为2的时候没考虑
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<map> using namespace std; typedef long long ll; const int p=998244353; int n,q; char s[1010]; int main() { scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d",&n); scanf("%s",s); if(s[0]<s[1]||n>2) { printf("YES\n"); printf("2\n"); printf("%c ",s[0]); for(int j=1;j<n;j++) printf("%c",s[j]); printf("\n"); } else{ printf("NO\n"); } } }
B.Digital root
题意:求第k大的数根为x的数
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<map> using namespace std; typedef long long ll; const int p=998244353; int n,q; ll k,x; char s[1010]; int main() { scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%I64d%I64d",&k,&x); printf("%I64d\n",(k-1)*9+x); } }
C.Brutality
题意:给你两个序列,第一个为价值,第二个为种类,求价值最大(一个限制条件是在种类相同的段里不能选超过k个)
思路:对个每个小段快排,取前k大。
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<vector> #include<map> using namespace std; typedef long long ll; const int p=998244353; int n,k,a[201010],q[201000]; char s[201000]; ll ans; vector<int> mp[30]; bool cmp(int a,int b) { return a>b; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } scanf("%s",s+1); int w=1,flag=s[1];q[1]=a[1]; for(int i=2;i<=n;i++) { if(s[i]!=flag) { sort(q+1,q+1+w,cmp); for(int j=1;j<=min(w,k);j++) ans+=q[j]; w=1;flag=s[i];q[1]=a[i]; } else{ q[++w]=a[i]; } } sort(q+1,q+1+w,cmp); for(int j=1;j<=min(w,k);j++) ans+=q[j]; // for(int i=1;i<=n;i++) // { // mp[s[i]-97].push_back(a[i]); // } // for(int i=0;i<=29;i++) // sort(mp[i].begin(),mp[i].end()); // for(int i=0;i<=29;i++) // { // for(int j=mp[i].size()-1;j>=0;j--) // { // ans+=mp[i][j]; // printf("%I64d %d\n",ans,mp[i].size()); // if(mp[i].size()-j+1>k) break; // } // } printf("%I64d\n",ans); }
D.Compression
题意:对于一个01矩形找到最大的矩形,使其满足
思路1:这道题的题意就是分解成若干最大的矩形是,使其内的值都为0或者1。用sum[i][j]表示二维前缀和,时间复杂度O(n*n*π*π/6)
#include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<vector> #include<map> using namespace std; typedef long long ll; const int p=998244353; int n,mp[5210][5210],sum[5210][5210],flag,w[10100]; char s[201010]; bool chec(int x,int y,int k) { //printf("%d %d %d\n",x,y,k); int zhi=sum[x*k][y*k]-sum[(x-1)*k][y*k]-sum[x*k][(y-1)*k]+sum[(x-1)*k][(y-1)*k]; //printf("zhi=%d\n",zhi); if(zhi==0||zhi==k*k) return 0; return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s); for(int j=0;j<strlen(s);j++) { int x; if(s[j]<=‘9‘) x=s[j]-‘0‘; else x=s[j]-‘A‘+10; int l=0; while(x>0) { mp[i][4*(j+1)-l]=x%2; x/=2;l++; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mp[i][j]; } } int l=0; for(int i=1;i<=trunc((double)sqrt(n));i++) if(n%i==0) { w[++l]=i;w[++l]=n/i; } sort(w+1,w+1+l); for(int i=l;i>=1;i--) { flag=0; int kuai=n/w[i]; // printf("%d\n",kuai); for(int k=1;k<=kuai;k++) { for(int j=1;j<=kuai;j++) if(chec(k,j,w[i])) { flag=1; // printf(" %d\n",w[i]); break; } if(flag) break; } if(!flag) { flag=w[i]; break; } } printf("%d\n",flag); }
思路2:巧妙官方题解,
Educational Codeforces Round 59 (Rated for Div. 2)
标签:detail str flag lan 题解 一个 compress ret root
原文地址:https://www.cnblogs.com/The-Pines-of-Star/p/10336301.html