Codeforces Round #559 (Div. 2) (还差2题)
总结:这次写的太菜了,一个B题写了很久, 这种维护一个最小值在计算的题目,下次要反应快点;
C题是一个贪心,写的时候也是想了好久....
D题这个范围.
题目链接:https://codeforces.com/contest/1159
A:
签到,算一个最开始有多少就行了,注意可以取到0,复杂度O(n)
#include <cstdio> #include <iostream> using namespace std; int main() { int n; char c; int ca=0, cb=0, beg=0; cin>>n; while(n--) { cin>>c; if(c=='+') ca++; else if(c=='-')cb++; if(beg+ca-cb<0) beg++; } //printf("ca=%d\ncb=%d\nbeg=%d\n", ca , cb, beg); cout<<beg+ca-cb<<endl; return 0; }
B:
给出公式,求k的范围,枚举当前的最小的a[i],求满足条件的k即可,这题反应太慢了...复杂度O(nlogn)
#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=1e6+5; struct Node{ int val; int cnt; }a[MAXN]; bool cmp(Node x, Node y){ return x.val<y.val; } int main() { int ans=INF; int n; cin>>n; for(int i=1; i<=n; i++) { cin>>a[i].val; a[i].cnt=i; } sort(a, a+n, cmp); for(int i=1; i<=n; i++) ans=min(ans, a[i].val/max(a[i].cnt-1, n-a[i].cnt)); cout<<ans<<endl; return 0; }
C:
题意:给了n个boys对m个girls的 sweet 的min(n组),m个girls接受到n个boys的sweet的max(m组),求n个男生对m个女生的sweet的最小的和,不满足条件输出-1 ;
题解:先判断是否满足条件,对n个男生的min排序,对m个女生的max排序,优先将大的max添加到大的min那一组,在求一个sum;复杂度O(nlogn)
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAXN=2e6; int a[MAXN], b[MAXN], vis[MAXN], vismin[MAXN]; int main() { //freopen("in.txt", "r", stdin); int n, m; cin>>n>>m; for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1; i<=m; i++) cin>>b[i]; long long sum=0; for(int i=1; i<=n; i++) sum+=a[i]; sum*=m; sort(a+1, a+1+n); sort(b+1, b+1+m); memset(vismin, 0, sizeof(vismin)); for(int i=1; i<=n; i++) vis[i]=m-1; int ok=1; for(int i=m; i>=1; i--) { if(b[i]<a[n]){ ok=0; break; } } if(ok==0) cout<<"-1"<<endl; else { int A=n, B=m; for(int B=m; B>=1; B--) { while(b[B]<a[A]) A--; if(b[B]==a[A]) { if(!vismin[A]) vismin[A]=1; else if(vis[A]>0) vis[A]--; else if(a[A-1]==b[B]){ A--; vismin[A]=1; } else { A--; vis[A]--; } sum+=b[B]-a[A]; } else { if(vis[A]>0) vis[A]--; else if(a[A-1]==b[B]){ A--; vismin[A]=1; } else { A--; vis[A]--; } sum+=b[B]-a[A]; } } cout<<sum<<endl; } return 0; }
D:
题意:给了n和k,n代表长度为n由0或者1组成的串,找出一个这样长度的串,且该串中最长的唯一子串的长度是k;重要条件:n,k的奇偶性相同
题解:找规律题,
#include <bits/stdc++.h> using namespace std; int main() { int n, k; cin >> n >> k; int a=(n-k)/2+1; for(int i=1; i<=n; i++) { if(i%a==0) printf("1"); else printf("0"); } return 0; }