Codeforces Round #171 (Div. 2)总结
来源:互联网 发布:mac 进入mysql命令行 编辑:程序博客网 时间:2024/05/06 18:26
A题:
题目是说按所给的漩涡形扩展下去,然后给你一个坐标,问到达该坐标需要转向几次。我的做法是将左边分为4个区域,然后分别对每个区域的2个边进行讨论求解就行了。
对(1,0)点进行了特殊处理。
代码:
#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>using namespace std;int x,y;int main(){ while(scanf("%d%d",&x,&y)!=EOF) {int ans=0;if(x==1&&y==0) ans=0;else if(x>0&&y>=0){ if(x>=y)ans=(x-1)*4+1; elseans=(y-1)*4+2;}else if(x<=0&&y>0){ if(-x<=y)ans=(y-1)*4+2; elseans=(-x-1)*4+3;}else if(x<0&&y<=0){ if(y>=x)ans=(-x-1)*4+3; elseans=-y*4;}else{ if(x<=-y+1)ans=-y*4; elseans=(x-1)*4+1;}printf("%d\n",ans); } return 0;}
B题:
大意是说有n本书,对书进行编号,每本书要消耗ai的时间去阅读,你只能选择对书进行连续的阅读,要求求出在t的时间内最多能阅读多少本书。
维护一个队列,保证当前书区间的总时间小于等于m,然后更新区间,更新答案即可。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#define MAX 100001using namespace std;int book[MAX],sum[MAX];int n,m;int main(){ while(scanf("%d%d",&n,&m)!=EOF) {memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){ scanf("%d",&book[i]); sum[i]=sum[i-1]+book[i];}int pre=0,last=1;int ans=0;while(last<=n){ if(sum[last]-sum[pre]<=m) {ans=max(ans,last-pre);last++; } elsepre++;}printf("%d\n",ans); } return 0;}
C题:
其实题意不算太难,就是判断它所查询的区间是否满足题目的要求,要求就是求一个区间内是否满足单增再单减,或者只有单增单减,或者全部相等。
我采用的方法是求出当前点所能到达的最远的单增单减点,最开始是求的前方所能到达的最前端点。
后来我采用当前结点记录所能到达的最远的递增递减点,然后进行判断,然后就能AC了~
代码(前方):
#include<cstdio>#include<cstring>#include<iostream>#define MAX 100001using namespace std;int n,m,a[MAX],up[MAX],down[MAX];int main(){ while(scanf("%d%d",&n,&m)!=EOF) {for(int i=1;i<=n;i++) scanf("%d",&a[i]);up[1]=down[1]=1;for(int i=2;i<=n;i++){ if(a[i]==a[i-1]) {up[i]=up[i-1];down[i]=down[i-1]; } else if(a[i]>a[i-1]) {up[i]=up[i-1];down[i]=i; } else {down[i]=down[i-1];up[i]=i; }}for(int i=0;i<m;i++){ int ita,itb; scanf("%d%d",&ita,&itb); int mid=down[itb]; if(mid<=ita||up[mid]<=ita)printf("Yes\n"); elseprintf("No\n");} } return 0;}
代码(后方):
#include<cstdio>#include<cstring>#include<iostream>#define MAX 100001using namespace std;int n,m,a[MAX],up[MAX],down[MAX];int main(){ while(scanf("%d%d",&n,&m)!=EOF) {for(int i=1;i<=n;i++) scanf("%d",&a[i]);up[n]=down[n]=n;for(int i=n-1;i>=1;i--){ if(a[i]==a[i+1]) {down[i]=down[i+1];up[i]=up[i+1]; } else if(a[i]>a[i+1]) {down[i]=down[i+1];up[i]=i; } else {up[i]=up[i+1];down[i]=i; }}for(int i=0;i<m;i++){ int l,r; scanf("%d%d",&l,&r); int mid=up[l]; if(down[mid]>=r)printf("Yes\n"); elseprintf("No\n");} } return 0;}
E题:
参照网上别人做的思路,自己做了下。
代码:
#include<cstdio>#include<cstring>#include<iostream>#define MAX 1000001using namespace std;char str[MAX];int main(){ while(scanf("%s",str)!=EOF) {int ans=0,zero=2,pos=0;for(int i=0;i<strlen(str);){ if(str[i]=='1') {int cou=0;while(str[i+cou]=='1') cou++;if(cou==1){ ans++; if(zero>1)pos=1;}else if(zero==1){ ans++; if(pos)ans++; pos=0;}else{ ans+=2; pos=0;}i+=cou; } else {zero=0;while(str[i+zero]=='0') zero++;i+=zero; }}printf("%d\n",ans); } return 0;}
- Codeforces Round #171 (Div. 2)总结
- Codeforces Round #171 (Div. 2)
- Codeforces Round #171 (Div. 2)
- Codeforces Round #161 (Div. 2)总结
- Codeforces Round #162 (Div. 2)总结
- Codeforces Round #170 (Div. 2)总结
- Codeforces Round #172 (Div. 2)总结
- Codeforces Round #173 (Div. 2)总结
- Codeforces Round #176 (Div. 2)总结
- Codeforces Round #185 (Div. 2) 总结
- Codeforces Round #187 (Div. 2) 总结
- Codeforces Round #190 (Div. 2) 总结
- Codeforces Round #193 (Div. 2)总结
- Codeforces Round #194 (Div. 2)总结
- Codeforces Round #204 (Div. 2)总结
- Codeforces Round #237 (Div. 2) 总结
- Codeforces Round #238 (Div. 2) 总结
- Codeforces Round #243 (Div. 2)总结
- C++第1周项目3——结构体数组处理学生成绩
- vc 调试技巧
- 怎样用文件或命令行 添加\删除注册表项
- 算法方面的经典书籍
- stringbuider用法
- Codeforces Round #171 (Div. 2)总结
- struts2入门(7)--国际化
- ACE 关联容器 MAP
- cpu 的大端,小端,Big_endian,little_endian
- 【北大天网搜索引擎TSE学习笔记】第9节——显示搜索结果
- 在java中怎么把字节数组转换成二进制字符串
- 关于人工智能的幻想(三)其实我也迷糊啊
- Android service
- Oracle 减少redo size的方法