AtCoder Beginner Contest 072

来源:互联网 发布:五十知天命六十耳顺 编辑:程序博客网 时间:2024/05/17 16:55

题目链接:http://abc072.contest.atcoder.jp/

纪念第一次写完4道题,尽管4道都是水题。

下面上代码。

AC代码:

/*2017年9月2日23:15:46 A简单比较大小 */ #include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>using namespace std;int main(){int n,t;scanf("%d%d",&n,&t);if(t>=n) printf("0\n");else printf("%d\n",n-t);return 0;} 


/*2017年9月2日23:15:46 B简单输出 */ #include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>using namespace std;const int maxn=1e5+10;char s[maxn];int main(){scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i+=2){printf("%c",s[i]);} printf("\n");return 0;}


/*2017年9月2日23:15:46 C统计每一种可能性,最后取次数出现最多的。注意-1 用另外一个数组存就行 */ #include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>using namespace std;const int maxn=1e5+10;int a[maxn];int b[maxn];//b[0]代表-1的个数 int main(){int n;scanf("%d",&n);for(int i=0;i<maxn;i++) a[i]=0;b[0]=0;int ans=0;for(int i=1;i<=n;i++){int x;scanf("%d",&x);if(x>=1){a[x-1]++;a[x]++;a[x+1]++;ans=max(ans,max(a[x-1],max(a[x],a[x+1])));}else{b[0]++;a[x]++;a[x+1]++;ans=max(ans,max(b[0],max(a[x],a[x+1])));} } printf("%d\n",ans);return 0;}


/*2017年9月2日23:15:46 D找规律,手推几个就可以先扫一遍,如果a[i]==i 就打个标记然后扫一遍标记,如果出现连续s[i]不为0 记为pre[i] 为当前位置连续的几个s[i]==true  也就是  a[i]==i 如果pre[i]==1 且前后都是0 答案+1如果pre[i]>1 且pre[i+1]=0 也就是说 当前最多连续有pre[i]的 a[i]==i 答案+  pre[i]/2  向上取整 */ #include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>using namespace std;const int maxn=1e5+10;int a[maxn];bool s[maxn];int pre[maxn];int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==i) s[i]=true;else s[i]=false; }if(s[1]) pre[1]=1;else pre[1]=0;for(int i=2;i<=n;i++){if(s[i]) pre[i]=pre[i-1]+1;else pre[i]=0;}int ans=0;for(int i=1;i<n;i++){if(!pre[i]||pre[i]<pre[i+1]) continue;else{if(pre[i]&1) ans+=(pre[i]+1)/2;else ans+=pre[i]/2;}}/*上面的循环没有考虑到pre[n]单独拿出来考虑*/ if(pre[n]&1){ans+=(pre[n]+1)/2;}else if(pre[n]){ans+=pre[n]/2;}printf("%d\n",ans);return 0;}