AtCoder Beginner Contest 081

今天做了一套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[n] = a[n] a[n-1] = a[n-1] + a[n] , a[n-2] = a[n] + 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);
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值