2021-02-04

2021年2月3日

话不多说直接上题吧
A - 分宝石

有6种宝石,价值分别为1,2,3,4,5,6。
现在有一个长度为6的数组,第i个数字表示价值为i的宝石的数量。
例如:[1,0,1,2,0,0]表示有一个价值为1的宝石,一个价值为3的宝石和两个价值为4的宝石。
请判断能否将所有宝石分为两部分,使得两部分价值相等。
注意:宝石不能分割,比如价值为6的宝石不能分割为两个价值为3的宝石。
Input
每一行输入描述一个要划分的宝石集合。
每个集合有6个非负整数a1, a2,…, a6,其中ai为价值i的宝石数量。
宝石的最大总数将是20000。
输入文件的最后一行为’’ 0 0 0 0 0 "; 不用处理此行。
Output
对于每一行输入,输出Collection #k:, 其中k表示第一个样例(从1开始),然后输出Can be divided.(可以分成两部分)或者Can’t be divided.(不可以分成两部分)。
在每个测试用例之后输出一个空行。
Sample Input
1 0 1 2 0 0
1 0 0 0 1 1
0 0 0 0 0 0
Sample Output
Collection #1:
Can’t be divided.
Collection #2:
Can be divided.

很好就是这个题目 我不晓得我花了多久
从刚开始看错题目了 以为是6个宝石 输入他的价值 看能不能分2堆
害!我好傻!
然后写完了代码 调试一下 结果样例过不了 然后就又看了一边题目
终于看懂了 是6种价值的宝石 输入个数分2堆
然后 我就想啊 分2堆 那么应总价值是偶数 于是就有

	for(int i=1;i<=6;i++)
		{
			scanf("%d",a+i);
			sum+=a[i]*i;
			if(a[i]==0)count++;
		}
		if(sum%2)
		{
			printf("Collection #%d:\nCan't be divided.\n",num);
			num++;
			continue;
		}

不是偶数 就直接pass掉(这里pass)是筛选的
然后 就想 分2堆是一样价值的 是吧
好 我就分啊 分啊 分把每种价值东西 左边放一半 右边放一半 不就ok了
这样一来 就是一样价值了的了 然后就是说如果是偶数 那么左边 右边 都放一半 是奇数 那么就留下了 一个 左右就是剩下一半 然后还剩下的
个数 要不0 要不 1然后我就列举了 所有所有情况 就是剩下的数字当中可以平衡吗!!!! 结果这种贪心(有点像贪心吧)是错误的
我一直以为没错 结果调啊 调啊 调 列举啊列举啊 列举
于是乎
在这里插入图片描述
好可怜啊!!!
没事 我不怕
换个贪心试一试
于是有

#include<stdio.h>
#include<string.h> 
//using namespace std;
int book[7];//搜索用
int main()
{
	int a[7];
	int num=1;
	while(1)
	{
		memset(book,0,sizeof(book));
		int sum=0;
		int count=0;
		int a[7];
		for(int i=1;i<=6;i++)
		{
			scanf("%d",a+i);
			sum+=a[i]*i;
			if(a[i]==0)count++;
		}
		if(count==6)break;
		if(sum%2)
		{
			printf("Collection #%d:\nCan't be divided.\n",num);
			num++;
			continue;
		}
		int ans=sum/2;
		int d[7];
		for(int i=6;i>=1;i--)
		{
			while(ans>=i&&a[i])
			{
				ans-=i;
				a[i]--;
			}
		 } 
		 
		 if(ans==0)	printf("Collection #%d:\nCan be divided.\n",num);
		 else 	printf("Collection #%d:\nCan't be divided.\n",num);
		num++;
	}
	return 0;
 }

可惜还是错误的。。。。。
期间这个题 也尝试过动态给规划!!!!
结果不会写 不晓得怎么规划 找不到最后一步!!!!
也就是说我尽力了 求个人赐教吧
我相信这个题目 一定可以dp解决的
终于我还是放弃了
下面看B题
B - 补提交卡
在这里插入图片描述
这个题我过了 耶
在这里插入图片描述
虽然道路也是道路坎坷
附上AC代码

#include<stdio.h>
#include<string.h>
int a[120];
int main()
{
int t;
scanf("%d",&t);
while(t–)
{
int n;
int k;
scanf("%d%d",&n,&k);
memset(a,0,sizeof(0));
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
}
if(k>=n)printf(“100\n”);
else
{
//a[n+1]=100;
int max=0;
for(int i=k;i<n;i++)
{
int sum1=a[i+1]-1-a[i-k];
// int sum2;
if(max<sum1)max=sum1;
}
if(max<100-a[n-k])max=100-a[n-k];//不用减去1 操 傻逼 杜东京
printf("%d\n",max);
}
}
return 0;
}

注释的话就是我错误的点了 呜呜呜!

来一个勉励自己的话吧!!!!
我不能输!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值