2013金山西山居创意游戏程序挑战赛——初赛(1)

本文介绍了一种通过模拟的方式解决字符串匹配问题的方法,并提出一种竞赛难度排序算法,利用优先队列进行高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
    魔法串
   模拟题,两字符串从前到后扫描,
   如果当前字符相等,两字符同时向后移动一位 
   否则,b字符是否能转化成前一个字符
   直到结束 
  
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define maxn 1000+10

int map['z'+10]['z'+10];

char a[maxn],b[maxn];
int main()
{
   int t,n;
   
   char ch1,ch2;
   
   int Case=0;
   
   scanf("%d",&t);
   int i,j;
    while(t--)
    {
      scanf("%s",a+1);
      scanf("%s",b+1);     
      
      scanf("%d",&n); 
      
     // for(int i='a';i<='z';i++)
      //  map[i]=i;
      memset(map,0,sizeof(map));
       
      for( i=1;i<=n;i++)
      {
        cin>>ch1>>ch2;
        
        map[ch1][ch2]=1;
       // map[ch2][ch1]=1;                 
      }    
      
     // for(int i='a';i<='z';i++)
     // printf("%c",map[i]);  
     
     int len1=strlen(a+1);
     
     int len2=strlen(b+1);
     
     //for(i=1;i<=len1;i++)
      // for(j=1;j<=len2;j++)
      i=1;
      j=1;
      while(i<=len1 && j<=len2)
       {
                    
         if(a[i]==b[j] || map[b[j]][a[i]]  )
         {
           i++;
         }
        // else
        //   break; 
         j++;
      }
      
      if(i>len1)
       printf("Case #%d: happy\n",++Case);  
        else  
      printf("Case #%d: unhappy\n",++Case);  
      
              
              
    }
    
    
    
return 0;    
} 


//从第二串第一个开始 
//与第一串的第一个匹配如果相同就比下一个,
//不同看能不能改成相同,改不成就删掉。就这样一直到最后。
/*  
   比赛难度
   将题目按照难度排序。
   这题状态可以记录为两个值,a:当前所取的总难度和,b:最后取的一道题的题号。
   那么从这个状态拓展的下一个最有可能的状态就是
   1:去掉第b道题,取第b+1道题;
   2:取现在状态所取的所有题加上第b+1道题。
*/

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

const int N=10000+100;
 
struct Item
{
  int sum,index;
  
  bool operator<(const Item& a)const{
        return (sum>a.sum || sum==a.sum && index>a.index);  //从小到大排序 
       }       
};


priority_queue<Item> q;


int v[N];

int main()
{
    int t,n,m;
    Item item;
    int a,b;
    int Case=1;
   scanf("%d",&t);
   
   while(t--)
   {
        scanf("%d%d",&n,&m);
        
        for(int i=1;i<=n;i++)
         scanf("%d",&v[i]);
         
         sort(v+1,v+n+1);     
        
        while(!q.empty())
         q.pop();
         
         item.sum=v[1];
         item.index=1;
        q.push(item);
        int count=0;
        int ans=1;
        
        while(!q.empty())
        {
               item=q.top();
               q.pop();
               count++;
               
               if(count>=m)
               {
                 //printf("%d\n",);    
                 ans =item.sum;
                 break;       
               }
               a=item.sum;
               b=item.index;
               
               if(b<n)
               {
                  item.sum=a-v[b]+ v[b+1];
                  item.index=b+1;    
                  q.push(item);
                  
                  item.sum=a + v[b+1];
                  item.index=b+1;    
                  q.push(item);
               }
         }      
         printf("Case #%d: %d\n",Case++,ans);  
    } 
    
    
    
return 0;    
} 


资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 今天给大家分享一个关于C#自定义字符串替换方法的实例,希望能对大家有所帮助。具体介绍如下: 之前我遇到了一个算法题,题目要求将一个字符串中的某些片段替换为指定的新字符串片段。例如,对于源字符串“abcdeabcdfbcdefg”,需要将其中的“cde”替换为“12345”,最终得到的结果字符串是“ab12345abcdfb12345fg”,即从“abcdeabcdfbcdefg”变为“ab12345abcdfb12345fg”。 经过分析,我发现不能直接使用C#自带的string.Replace方法来实现这个功能。于是,我决定自定义一个方法来完成这个任务。这个方法的参数包括:原始字符串originalString、需要被替换的字符串片段strToBeReplaced以及用于替换的新字符串片段newString。 在实现过程中,我首先遍历原始字符串,查找需要被替换的字符串片段strToBeReplaced出现的位置。找到后,就将其替换为新字符串片段newString。需要注意的是,在替换过程中,要确保替换操作不会影响后续的查找和替换,避免遗漏或重复替换的情况发生。 以下是实现代码的大概逻辑: 初始化一个空的字符串result,用于存储最终替换后的结果。 使用IndexOf方法在原始字符串中查找strToBeReplaced的位置。 如果找到了,就将originalString中从开头到strToBeReplaced出现位置之前的部分,以及newString拼接到result中,然后将originalString的查找范围更新为strToBeReplaced之后的部分。 如果没有找到,就直接将剩余的originalString拼接到result中。 重复上述步骤,直到originalStr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值