10054 - The Necklace

本文介绍了一个珠子串匹配问题的解决方法,通过使用深度优先搜索(DFS)算法来寻找所有可能的珠子串连接方式,使得相邻珠子的颜色相同。程序能够处理多个测试案例,并在发现无法配对的情况时输出提示。

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

给出n个珠子,珠子两边有不同的颜色,把珠子串起来,要求相邻珠子的颜色一样

#include<stdio.h>
#include<string.h>
int n,d[55],map[55][55];
void dfs(int s)
{
    int i;
    for(i=1;i<=50;i++)
    {
        if(map[s][i])
        {
            map[i][s]--;
            map[s][i]--;
            dfs(i);
            printf("%d %d\n",i,s);
        }
    }
}
int main()
{
    int i,j,m,k;
    scanf("%d",&m);
    for(j=0;j<m;j++)
    {
        memset(d,0,sizeof(d));
        for(i=1;i<=50;i++)
            for(k=1;k<=50;k++)
                map[i][k]=0;
        scanf("%d",&n);
        int x,y;
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            map[x][y]++;
            map[y][x]++;
            d[x]++;
            d[y]++;
        }
        int flag=0,max=0,ss=0;
        for(i=1;i<=50;i++)
        {
            if(d[i]%2==1)
            {
                flag=1;
                break;
            }
            else if(d[i]>max)
            {
                max=d[i];
                ss=i;
            }
        }
        if(j)
            printf("\n");
        if(!flag)
        {
            printf("Case #%d\n",j+1);
            dfs(ss);
        }
        else
            printf("Case #%d\nsome beads may be lose\n",j+1);
    }
    return 0;
}

### 2021 CCPC Guangzhou Onsite 题目解析 #### H题: Three Integers 该题目主要考察的是分类讨论以及合理运用倍数关系的能力。当输入数据中存在一个零时,需特别注意是否存在数值为1的情况。在这种情况下,为了防止被特定测试用例攻击(即所谓的“hack”),应适当调整倍数逻辑[^1]。 以下是实现此算法的一个可能代码示例: ```cpp #include <bits/stdc++.h> using namespace std; int main(){ int a,b,c; cin>>a>>b>>c; vector<int> nums={abs(a), abs(b), abs(c)}; sort(nums.begin(),nums.end()); long long res=LLONG_MAX; do{ if(nums[1]==0 && nums[2]!=0){ // 特殊情况处理 res=min(res,(long long)(nums[0]*nums[2])); } else { // 正常计算最小操作次数 long long temp=(nums[1]-nums[0]%nums[1])%nums[1]; temp += (nums[2]-nums[1]%nums[2])%nums[2]; res = min((long long)res,temp); } }while(next_permutation(nums.begin(),nums.end())); cout<<res<<"\n"; } ``` #### C题: Necklace 对于C题Necklace而言,其核心思路在于如何通过贪心策略来解决问题。具体来说,可以从第一个节点出发尝试尽可能地向右扩展路径长度;一旦遇到超出允许的最大长度`max_len`的情形,则将整个项链结构向左侧平移一定距离,从而最大化利用可用空间并减少资源浪费[^4]。 下面给出了一种基于上述思想的解决方案框架: ```cpp // 假设已知一些变量定义如 max_len, nodes 等... bool check(double mid){ double sum=0; for(auto &len:nodes){ if(sum+len<=mid){ sum+=len; } else{ return false; } } return true; } double binarySearch(){ double l=0,r=accumulate(nodes.begin(),nodes.end(),0.0); while(r-l>=EPS){ double mid=l+(r-l)/2; if(check(mid)){ r=mid-EPS; } else{ l=mid+EPS; } } return l; } ``` 以上两道典型题目展示了不同类型的解法技巧——前者依赖于细致入微的状态枚举与边界条件判断,后者则体现了经典优化理论中的动态规划与二分查找相结合的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值