Codeforces Round #Pi (Div. 2)
来源:互联网 发布:照片时间修改软件 编辑:程序博客网 时间:2024/05/20 15:12
B题
A题
题目大意:
给出一个数组,找每个位置的与序列里的其他值的差的绝对值最大值与最小值。
解题思路:
记录位置并排序,最大值肯定与排序后的头元素或尾元素的差,最小值肯定是排序后的位置的前一个元素或者后一个元素。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=200000+1000;struct node{ int x; int cur;}a[maxn];int b[maxn];int c[maxn];bool cmp(node u,node v){ return u.x<v.x;}int bbs(int x){ if(x<0) return -x; return x;}int main(){ int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d",&a[i].x); a[i].cur=i; } sort(a,a+n,cmp); for(int i=0;i<n;i++) { if(i==0) b[a[i].cur]=a[i+1].x-a[i].x; else if(i==n-1) b[a[i].cur]=a[n-1].x-a[i-1].x; else b[a[i].cur]=min(bbs(a[i-1].x-a[i].x),bbs(a[i+1].x-a[i].x)); c[a[i].cur]=max(bbs(a[0].x-a[i].x),bbs(a[n-1].x-a[i].x)); } for(int i=0;i<n;i++) printf("%d %d\n",b[i],c[i]); } return 0;}
B题
题目大意:
给出进出日志,求房间的最小容量。
解题思路:
房间的容量取决于房间最多人的时候。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <algorithm>using namespace std;const int maxn=1000000+100;int a[maxn];int c[maxn];int main(){ char s[15]; int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); int d; int ans=0,cur=0; int sign=0; for(int i=0;i<n;i++) { scanf("%s%d",s,&d); if(s[0]=='+') { sign++; a[d]=1; c[i]=sign; } else { if(a[d]==1) { sign--; a[d]=0; c[i]=sign; } else { c[i]=c[i-1]+1; for(int j=i-1;j>=0;j--) c[j]++; } } } for(int i=0;i<n;i++) { ans=max(ans,c[i]); } cout<<ans<<endl; } return 0;}
C题
题目大意:
给出一段序列,求序列里的3个数成等比数列,且比值为k的数量。
解题思路:
配句中间那个元素,前面那个元素和后面那个元素出现的次数相乘就可。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <algorithm>using namespace std;map<long long,int> ma;map<long long,int> ma2;long long a[210000];int main(){ int n,k; scanf("%d%d",&n,&k); for(int i=0; i<n; i++) { cin>>a[i]; } ma.clear(),ma2.clear(); for(int i=n-1; i>=0; i--) { ma[a[i]]++; } long long ans=0; for(int i=0; i<n; i++) { ma[a[i]]--; long long cur=0; if(ma[a[i]*k]) { cur=ma[a[i]*k]; if(a[i]%k==0) { if(ma2[a[i]/k]) { cur=cur*ma2[a[i]/k]; //cout<<cur<<" "<<ma2[a[i]/k]<<" "<<a[i]/k<<endl; } else cur=0; } else cur=0; } ma2[a[i]]++; ans+=cur; //cout<<cur<<endl; } cout<<ans<<endl; return 0;}
D题
题目大意:
n个1*1的小格子,k个1*a的小船,要将k个小船放进n个格子内,不能相邻,接着m个操作,每次让第xi个格子不能用,求第几个操作后船就放不下了。
解题思路:
每次操作,只会讲1段区间分成2段,只需求分开前后少放了几个小船。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <set>using namespace std;set<int> s;int main(){ int n,k,a; scanf("%d%d%d",&n,&k,&a); int m,x; scanf("%d",&m); s.insert(0); s.insert(n+1); int ans=-1; int cur=1+(n-a)/(a+1),x1,x2; //cout<<cur<<endl; if(cur<k) { ans=0; } for(int i=0;i<m;i++) { scanf("%d",&x); if(ans!=-1) continue; int temp=*(--s.upper_bound(x)); int tempd=*(s.upper_bound(x)); s.insert(x); //cout<<temp<<" "<<tempd<<endl; x1=0,x2=0; if(tempd-temp-1>=a) x1=1+(tempd-temp-1-a)/(a+1); if(x-temp-1>=a) x2=1+(x-temp-1-a)/(a+1); if(tempd-x-1>=a) x2+=(1+(tempd-x-1-a)/(a+1)); //cout<<x1<<" "<<x2<<endl; cur-=(x1-x2); if(cur<k) { ans=i+1; } } cout<<ans<<endl; return 0;}
0 0
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2)
- Codeforces Round #Pi (Div. 2) A B
- Codeforces Round #Pi (Div. 2) Problem C
- Codeforces Round #Pi (Div. 2) (ABCD)
- Codeforces Round #Pi (Div. 2) (STL专场)
- Codeforces Round #Pi (Div. 2) ABCD
- Codeforces Round #Pi (Div. 2) E
- codeforces Round #Pi (div.2) 567ABCD
- Codeforces Round #Pi (Div. 2) (ABCD题解)
- Codeforces Round #Pi (Div. 2) C
- Codeforces Round #Pi (Div. 2) C. Geometric Progression dp
- Codeforces Round #Pi (Div. 2) B. Berland National Library
- A. Lineland Mail-水题-Codeforces Round #Pi (Div. 2)
- $(window).load(function() {})和$(document).ready(function(){})的区别
- android图片处理
- C(4)
- 类成员的指针
- POJ 2128:Highways
- Codeforces Round #Pi (Div. 2)
- List排序问题
- 比较两个字符串的大小(两种方法,重点在介绍数组元素可以作为函数的实参)
- 原生js绑定和解除事件
- iOS 刷新window根视图
- SpringMVC原理
- WebView使用时需要注意的细节问题(持续总结)
- 南邮 OJ 1733 跳棋
- C(5)