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;
}
注释的话就是我错误的点了 呜呜呜!
来一个勉励自己的话吧!!!!
我不能输!!!!!!!