为什么我的回答总是出错
Why my answer always gets wrong
我正在解决 Codechef 上的一个问题 BUY1GET1.Here 是问题。
一天,爱丽丝去拜特兰为她即将到来的结婚纪念日购买珠宝。
在Byteland,每家珠宝店都有自己的折扣方式来吸引顾客。一种称为 Buy1-Get1 的折扣方法引起了爱丽丝的注意。也就是说,爱丽丝购买了一颗宝石,那么她可以通过 Buy1-Get1 的方式免费获得一颗相同颜色的宝石。
Alice将需要的珠宝列为一个字符串S,每个字母代表一个珠宝,相同的字母代表相同颜色的珠宝,不同的字母代表不同颜色的珠宝。每件珠宝的成本是 1。你的任务是计算让爱丽丝列出所有珠宝的最低成本。
输入
输入的第一行包含一行T,代表测试用例的数量。接下来是T行,每行包含一个字符串S,代表爱丽丝需要的珠宝。
输出
输出每个测试用例的最小成本。
约束
1≤T≤100
1 ≤ |S| ≤ 200,其中 |S|表示字符串S的长度。
字符串 S 区分大小写,并且只包含 [a-z]、[A-Z] 范围内的英文字符。
样本
Input:
4
ssss
ssas
sa
s
Output:
2
3
2
1
我在 Codechef 上总是得到错误的答案,但在我的 PC 上它给出与示例案例相同的输出。我不明白为什么?
这是我的代码。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int t;
scanf("%d\n",&t);
while(t--)
{
int i,j,n,m=0,k=0;
char a[201];
scanf("%s",a);
n=strlen(a);
int count=0;
for(i=0;i<n;i++)
{
count=0;
if(isalpha(a[i]))
{
count++;
for(j=i+1;j<n;j++)
{
if(a[j]==a[i])
{
count++;
a[j]=++k;
}
}
}
//printf("%dc\n",count );
if(count%2==0)
{
m+=(count/2);
//printf("%dm1\n",m);
}
else if(count%2!=0)
m+=(1+count/2);
}
printf("%d\n",m );
}
return 0;
}
解决方案:
#include<stdio.h>
int main()
{
int t,h[256],i,cost;
scanf("%d",&t);
char s[201];
while(t--)
{
for(i=0;i<256;i++)
h[i]=0;
scanf("%s",s);
i=0;
while(s[i])
{
h[s[i]]++;
i++;
}
cost = 0;
for(i='A';i<='z';i++)
if(h[i]&1)
cost += h[i]/2 + 1;
else
cost += h[i]/2;
printf("%d\n",cost);
}
return 0;
}
int sum = 0;
//search number of occurences for each alphabet in the string
for (i=0; i<26; i++) {
sum += (numchar(str, 'a' + i) +1) / 2; //round up
}
您可以编写自己的 numchar
函数来查找字符串 c
中存在的字符数 s
:
int numchar(char[] s, char c) {
int i = 0, n = 0;
while ( s[i] != '[=11=]' ) {
if (s[i] == c) n++;
i++;
}
return n;
}
好的
只需替换以下行:
a[j]=++k;
和
a[j]= '[=11=]';
然后重新提交。
说明
对于某些情况,k 的值在 65-90 和 97-122 之间
然后 k 被视为一个字符,因为它获得了一个字符的 ascii 值。
所以每次都给数组 a[] 赋一个空值,我认为它会起作用。
我正在解决 Codechef 上的一个问题 BUY1GET1.Here 是问题。
一天,爱丽丝去拜特兰为她即将到来的结婚纪念日购买珠宝。 在Byteland,每家珠宝店都有自己的折扣方式来吸引顾客。一种称为 Buy1-Get1 的折扣方法引起了爱丽丝的注意。也就是说,爱丽丝购买了一颗宝石,那么她可以通过 Buy1-Get1 的方式免费获得一颗相同颜色的宝石。 Alice将需要的珠宝列为一个字符串S,每个字母代表一个珠宝,相同的字母代表相同颜色的珠宝,不同的字母代表不同颜色的珠宝。每件珠宝的成本是 1。你的任务是计算让爱丽丝列出所有珠宝的最低成本。 输入
输入的第一行包含一行T,代表测试用例的数量。接下来是T行,每行包含一个字符串S,代表爱丽丝需要的珠宝。 输出
输出每个测试用例的最小成本。 约束
1≤T≤100 1 ≤ |S| ≤ 200,其中 |S|表示字符串S的长度。 字符串 S 区分大小写,并且只包含 [a-z]、[A-Z] 范围内的英文字符。 样本
Input:
4
ssss
ssas
sa
s
Output:
2
3
2
1
我在 Codechef 上总是得到错误的答案,但在我的 PC 上它给出与示例案例相同的输出。我不明白为什么? 这是我的代码。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{
int t;
scanf("%d\n",&t);
while(t--)
{
int i,j,n,m=0,k=0;
char a[201];
scanf("%s",a);
n=strlen(a);
int count=0;
for(i=0;i<n;i++)
{
count=0;
if(isalpha(a[i]))
{
count++;
for(j=i+1;j<n;j++)
{
if(a[j]==a[i])
{
count++;
a[j]=++k;
}
}
}
//printf("%dc\n",count );
if(count%2==0)
{
m+=(count/2);
//printf("%dm1\n",m);
}
else if(count%2!=0)
m+=(1+count/2);
}
printf("%d\n",m );
}
return 0;
}
解决方案:
#include<stdio.h>
int main()
{
int t,h[256],i,cost;
scanf("%d",&t);
char s[201];
while(t--)
{
for(i=0;i<256;i++)
h[i]=0;
scanf("%s",s);
i=0;
while(s[i])
{
h[s[i]]++;
i++;
}
cost = 0;
for(i='A';i<='z';i++)
if(h[i]&1)
cost += h[i]/2 + 1;
else
cost += h[i]/2;
printf("%d\n",cost);
}
return 0;
}
int sum = 0;
//search number of occurences for each alphabet in the string
for (i=0; i<26; i++) {
sum += (numchar(str, 'a' + i) +1) / 2; //round up
}
您可以编写自己的 numchar
函数来查找字符串 c
中存在的字符数 s
:
int numchar(char[] s, char c) {
int i = 0, n = 0;
while ( s[i] != '[=11=]' ) {
if (s[i] == c) n++;
i++;
}
return n;
}
好的
只需替换以下行:
a[j]=++k;
和
a[j]= '[=11=]';
然后重新提交。
说明
对于某些情况,k 的值在 65-90 和 97-122 之间 然后 k 被视为一个字符,因为它获得了一个字符的 ascii 值。
所以每次都给数组 a[] 赋一个空值,我认为它会起作用。