为什么我的回答总是出错

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[] 赋一个空值,我认为它会起作用。