您的位置:首页 > 其它

AtCoder Beginner Contest 081

2017-12-11 00:37 393 查看
今天做了一套atcoder的div2 吧,以为是北京时间 9点开始 ,才发现是 东京时间9点,北京时间是8点。。

之后感觉atcoder 相比于coderforces来说好敷衍啊。。。我cfdiv2次次都是b题选手啊 。。这次 差点ak,,,真是以后还是做div1吧 ,现在上题吧

点击打开链接 

题意: 给你三个字符问你‘1’的个数。。。不想说话 。。。

上代码

#include <stdio.h>
int main()
{
char a,b,c;
int ans = 0 ;
scanf("%c%c%c",&a,&b,&c);
if(a=='1')
{
ans++;
}
if(b == '1') ans++;
if(c == '1') ans++;
printf("%d\n",ans);
}b题点击打开链接
题意:给你一组数,问你这组数最多可以除多少次2,如果除2之后又奇数就不能在除了 ,思路 :没有思路。。直接写#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 200+10;
int a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i = 0 ;i < n ; i++)
{
scanf("%d",&a[i]);
}
int i = 0 ;
int ans = 99999 , sum = 0;
for(int i = 0 ; i < n ; i++)
{
sum = 0;
while(a[i])
{
if(a[i]&1)
{
break;
}
a[i] /= 2;
sum++;
}
ans = min(ans,sum);
}
printf("%d\n",ans);
}
c题:点击打开链接

题意: 给你一个数 N和K ,表示有N个数,之后让你最少改几个数字,让这N个数中,最多有K个不一样的数字

思路: 先看有几个不一样的数,如果少于K次的话就直接输出0,如果比k大的话,那我们就从小到大减去多余的数字就好了 ,水题。。。

上代码#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 2e5+10;
int a[maxn];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int t;
memset(a,0,sizeof(a));
int flag = 0;
for(int i = 0 ; i < n ; i ++)
{
scanf("%d",&t);
if(!a[t])
{
flag++;
}
a[t]++;
}
if(flag<=m) puts("0");
else
{
int ans = 0;
sort(a,a+n+1);
/*for(int i = 0 ;i <= n ;i++)
{
printf("%d ",a[i]);
}*/
for(int i = 0 ; i <= n;i++)
{
if(a[i])
{
flag--;
ans+=a[i];
}
if(flag <= m)
{
printf("%d\n",ans);
break;
}
}
}
}
}

D题 :(感觉今天晚上唯一有意义的一道题 。。。)
点击打开链接

题意 :给你一组数 ,你可以让aj = aj+ai,问你可以通过几次这样的相加使得序列是一个递增的序列。其中-1e6<ai<1e6,。

思路 : 一看就知道是个构造题。。。但是自己不会构造啊。。赛后看题解,题解是这样说的,如果单纯考虑这个序列是非负数的话,我们可以这样构造 a[1] = a[1] , a[2] = a[1] + a[2] ,a[3] = a[1] + a[2] + a[3] ,这样就肯定是一个递增的序列了 ,那如果都是负数的话,我们可以构造出 a
= a
a[n-1] = a[n-1] + a
, a[n-2] = a
+ a[n-1] +a[n-2]
这样也是一个递增序列,那么有正有负怎么办?那就我们都让他先全部变成正数或者全部都让他变成负数就好了,所以我们要比较|MAX| 和|MIN| 的大小,谁大我们就让序列加上他们让他们全部变成非负或非正之后按照刚才的思路去写就好了上代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 1e6+10;
const int inf = 1e7;
int a[55];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
int MAX = -inf, MIN = inf;
int idx , idn;
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&a[i]);
if(a[i] > MAX)
{
MAX = a[i];
idx = i;
}
if(a[i] < MIN)//我这里写了个 else worng 了好几发
{
MIN = a[i];
idn = i;
}
}
if(MIN>=0)
{
printf("%d\n",n-1);
for(int i = 1 ; i <n ;i++)
{
printf("%d %d\n",i,i+1);
}
}
else if(MAX <= 0)
{
printf("%d\n",n-1);
for(int i = n ; i>1 ; i--)
{
printf("%d %d\n",i,i-1);
}
}
else if(abs(MAX)>=abs(MIN))
{
printf("%d\n",2*n-1);
for(int i = 1 ; i <= n ; i++)
{
printf("%d %d\n",idx , i);
}
for(int i = 1 ; i < n ; i++)
{
printf("%d %d\n",i,i+1);
}
}
else
{
printf("%d\n",2*n-1);
for(int i = 1 ; i <= n ; i++)
{
printf("%d %d\n",idn,i);
}
for(int i = n ; i >1;i--)
{
printf("%d %d\n",i,i-1);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: