ccpc杭州K题(hdu5943) Kingdom of Obsession

本文探讨了一个特定的数学问题,即在给定的区间内寻找素数对的可能性,并通过二分图匹配算法解决该问题。讨论了算法实现细节及特殊情况处理。

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

首先如果s+1~s+n中有两个数是素数,那么肯定是no;也就是如果1~2e9中素数的最大距离如果是m,那当n>m时就不成立了。(其实上这有一点问题)
我直接假设m=1000,事实上m比500还要小。
那么现在问题就降为
1≤T≤100.
1≤n≤1000.
0≤s≤1e9.
那么问题就很简单了,如果s+k是某个i的倍数,那么s+k就是可能和i进行匹配(1可以和任何一个数匹配)。然后找最大匹配数是否==n-1(由于1可以和任何一个数匹配,所以把它移掉,减少边数) (二分图匹配!!!)

当时wa了,wa了。
怎么看都没敲错啊!队友说看题,突然哦,你取s=0,n=100000。纳尼,居然跑出来是no。特判呗
wa
队友:s=1也是可以的,我:特判
队友:等等,3呢 我: 哦。。。。。。
这样考虑 s+1<=n时,s+1~s+n与1~n有交叉,显然交叉的部分直接匹配就可以,那就剩n+1~s+n和1~s匹配。其实现在就相当于n和s的值换了一下。(所以此时n>500就应该改为(n>500&&s+1>n)||(s>500&&s+1<=n))
ac!

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <vector>
#include <cstring>
#include <queue>
#define msc(X) memset(X,-1,sizeof(X))
#define ms(X) memset(X,0,sizeof(X))
typedef long long LL;
using namespace std;

const int MAXN=505;
const int inf=0x3f3f3f3f;
vector<int> G[MAXN];
int Mx[MAXN],My[MAXN];
int dx[MAXN],dy[MAXN];
int dis,n;
bool used[MAXN];
bool SearchP(void)
{
    queue<int > Q;
    dis=inf;
    msc(dx);
    msc(dy);
    for(int i=2;i<=n;i++)
        if(Mx[i]==-1){
            Q.push(i);
            dx[i]=0;
        }
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        if(dx[u]>dis) break;
        int sz=G[u].size();
        for(int i=0;i<sz;i++)
        {
            int v=G[u][i];
            if(dy[v]==-1){
                dy[v]=dx[u]+1;
                if(My[v]==-1) dis=dy[v];
                else{
                    dx[My[v]]=dy[v]+1;
                    Q.push(My[v]);
                }
            }
        }
    }
    return dis!=inf;
}
bool DFS(int u)
{
    int sz=G[u].size();
    for(int i=0;i<sz;i++)
    {
        int v=G[u][i];
        if(!used[v]&&dy[v]==dx[u]+1){
            used[v]=true;
            if(My[v]!=-1&&dy[v]==dis) continue;
            if(My[v]==-1||DFS(My[v])){
                My[v]=u;
                Mx[u]=v;
                return true;
            }
        }
    }
    return false;
}
int MaxMatch(void)
{
    int res=0;
    msc(Mx);
    msc(My);
    while(SearchP()){
        ms(used);
        for(int i=2;i<=n;i++)
            if(Mx[i]==-1&&DFS(i))
                res++;
    }
    return res;
}
int main(int argc, char const *argv[])
{   
    int t,ti=0;
    scanf("%d",&t);
    while(++ti<=t){
        int s;
        scanf("%d%d",&n,&s);
        printf("Case #%d: ",ti );
        if(s<=2) {puts("Yes");continue;}
        if((n>500&&s+1>n)||(s>500&&s+1<=n)) {puts("No");continue;}
        if(n>500) swap(n,s);
        for(int i=2;i<=n;i++)
        {
            G[i].clear();
            for(int j=s+1;j<=s+n;j++)
                if(j%i==0) G[i].push_back(j-s);
        }
        puts(MaxMatch()==n-1?"Yes":"No");
    }
    return 0;
}
### 关于2023年江苏CCPC比赛的相关信息 根据已知的引用资料,虽然未直接提及2023年江苏CCPC的具体目,但可以结合其他赛事的经验和模式推测可能的内容结构以及需要注意的关键点。 #### 赛事概述 2023年的ICPC国际大学生程序设计竞赛南京站的比赛报告显示,正式赛日期为 **2023年11月5日周日**,参赛队伍总数达到331支[^1]。尽管该报告主要关注的是ICPC而非CCPC,但从两者的相似性和时间线来看,CCPC也可能在同一时间段内举行类似的活动。 #### 参考经验教训 从2021年的CCPC省赛总结可以看出,团队在比赛中遇到的主要挑战包括心态调整、细节把握以及队内沟通不足等问[^2]。这些方面同样适用于任何编程竞赛场景下,因此无论具体目如何变化,都需要重视以下几个环节: - **签到处理效率**:快速解决简单问以建立信心并节省后续复杂任务的时间。 - **思路验证充分性**:确保初步想法经过深思熟虑后再实施编码阶段。 - **成员协作流畅度**:鼓励每位队员分享个人见解以便集体达成最优解决方案路径。 #### 示例代码风格指导 基于过往比赛中的实际案例分析,下面展示了一段典型的C++实现片段用于计算累加折扣后的总价逻辑[^3]: ```cpp #include <iostream> #include <algorithm> using namespace std; double calculateTotal(int n, double prices[]) { double total = 0; sort(prices, prices + n); for (int i = 0; i < n; ++i){ if(total >=400 ){ total +=prices[i]; } else if( total>=150 && total<400 ){ total +=prices[i]*0.5 ; } else if( total>=100 &&total<150 ){ total +=prices[i]*0.8 ; } else{ total +=prices[i]; } } return round(total * 100)/100 ;//保留两位小数 } int main(){ int t; cin>>t; while(t--){ int numItems; cin >>numItems; double priceList[numItems]; for(auto &price : priceList )cin>>price ; cout<<fixed <<setprecision(2)<<calculateTotal(numItems ,priceList)<<endl; } } ``` 此代码展示了如何依据不同的条件应用相应的折扣率来更新总计金额,并最终输出精确至两位小数的结果。 #### 解决方案框架建议 针对类似于“给定一系列带颜色标记数值的操作序列”,可采用堆栈数据结构辅助完成目标——即寻找满足特定约束条件下最大化的最小值问[^4]。以下是简化版伪算法描述: 1. 初始化两个空列表分别代表`S1` 和 `S2`. 2. 遍历输入数组中的每一个元素: - 如果当前存在符合条件的不同颜色配对,则执行相应操作并将结果存入`S2`; - 否则仅将其加入`S1`. 3. 完成全部迭代后返回`S2`集合里的最小项作为答案. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值