`

tyvj 1348 清理内奸

    博客分类:
  • ACM
 
阅读更多
清理内奸


描述 Description  
最近FF博士在玩一个游戏“三国杀杀杀”,他扮演一个英明的主公,四处清剿反贼。终于把反贼全部干掉了,可是他的手下还存在着一些内奸

。经过他的观察和研究,终于发现了内奸的重要特征。内奸最重要的工作就是传递情报,所以内奸必须掌握各种加密方法。于是他们对素数有

一种偏好,编号是素数的人全部是内奸。FF博士将指挥忠臣干掉内奸。忠臣和内奸排成一排,第i个人的编号为Bi。杀死内奸会获得一定量经验

,等级为X的忠臣杀死任意等级的内奸会获得X点经验。每个人都有一定的攻击范围,若站在i位置的人攻击范围为k那么他可以杀[i-k,i+k]范围

内的人,但是每个人都只有一次攻击的机会。内奸们并不知道自己的身份已经暴露,不会攻击任何人,只能做待宰的羔羊,FF博士确定了攻击

方案后会在瞬间下令让忠臣行动,内奸会被秒(也就是内奸死亡不会对原来攻击范围造成影响)。
请帮FF博士计算
1、他这次最多能干掉多少内奸呢?
2、在干掉内奸人数最多的情况下,他能获得最多多少经验?

输入格式 Input Format 
第一行一个数字n,代表FF博士手下有n个人
第二行n个数,第i个数代表第i个人的编号Bi
3~n+2行,每行2个数x,k分别代表第i个人的等级和攻击范围。

输出格式 Output Format 
第一行是FF博士最多能干掉的内奸数量
第二行是FF博士在干掉最多内奸的基础上能获得的最多经验数。

样例输入 Sample Input  
7
1 2 3 4 5 6 8
1 1
3 1
4 1
5 2
10 5
1 1
0 100

样例输出 Sample Output  
3
7

时间限制 Time Limitation 
1S

注释 Hint 
样例解释
第2、3、5个人是内奸 (第7个不是,他的编号为8)
1杀2,获得1点经验
4杀3,获得5点经验
6杀5,获得1点经验
数据范围
对于100%的数据
n<=1000
Bi<=10^7
x,k<=100
所有数据不会出现负数。

分析:“这题其实很容易看出来,n个人分成了2个阵营。每个忠臣与他攻击范围内的内奸连一条边。此题第一问就是求二分图的最大匹配。第

二问是个贪心,权值在点上而不是在边上,所以按等级排序,优先满足等级高的忠臣。因为他一旦匹配成功,就不会被换下来。由于最大匹配

数肯定是确定的,所以让等级高的优先匹配并不会影响结果。”即对于二分原图得到的两个图,若两个子图内的元素之间不存在边,那么确定

一个图,另外一个图中的元素任意改变顺序,都不会影响到最大匹配,所以第二问中只要优先满足等级高的忠臣就可以得到正解。

小结:二分图的最大匹配+贪心(排序应该不是问题)
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
const int maxn = 1010;
struct person 
{
    int pno;//编号 
    int grade;//等级
    int range;//攻击范围 
    bool isPrime;//编号是否为素数 
    int cno;
};
struct node
{
    int index;//下标
    int grade; 
};
person p[maxn];
node x[maxn];
int n;
int white,black;
bool cmp(node a,node b)
{
    return a.grade>b.grade;
}
bool isPrime(int k)
{
    if(k==1)     return false;
    if(k==2)     return true;
    for(int i=2;i*i<=k;i++)
    {
        if(k%i==0)         return false;
    }
    return true;
}
int adjl[maxn][maxn];
int matx[maxn];
int maty[maxn];
int used[maxn];
int match;
bool find(int k)
{
    for(int i=1;i<=adjl[k][0];i++)
    {
        int j=adjl[k][i];
        if(!used[j])
        {
            used[j]=1;
            if(maty[j]==-1||find(maty[j]))    
            {
               maty[j]=k;
               matx[k]=j;
               return true;
            }
        }
    }
    return  false;
}
void hungary()
{
     for(int i=0;i<white;i++)
     {
        if(matx[x[i].index]==-1)
        {
           memset(used,0,sizeof(used));
           if(find(x[i].index))   
           {
              match++;
              //cout<<x[i].index<<endl;
           }
        }
     }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)   
    {
       cin>>p[i].pno;
       if(isPrime(p[i].pno))      p[i].isPrime=true;
       else                       p[i].isPrime=false;
    }
    for(int i=0;i<n;i++)   cin>>p[i].grade>>p[i].range;
    white=black=0;
    for(int i=0;i<n;i++)
    {
        if(p[i].isPrime)    p[i].cno=black++;
        else                
        {
            p[i].cno=white;
            x[white].index=white;
            x[white++].grade=p[i].grade;
        }
    }
    memset(adjl,0,sizeof(adjl));
    for(int i=0;i<n;i++)
    {
        if(!p[i].isPrime)
        {
            for(int j=max(0,i-p[i].range);j<=min(i+p[i].range,n-1);j++)
            {
                if(p[j].isPrime)
                {
                   int r=++adjl[p[i].cno][0];
                   adjl[p[i].cno][r]=p[j].cno;
                }
            }
        }
    }
    /*for(int i=0;i<white;i++)
    {
        cout<<i<<":  ";
        for(int j=1;j<=adjl[i][0];j++)
        {
           cout<<adjl[i][j]<<" ";
        }
        cout<<endl;
    }*/
    sort(x,x+white,cmp);
    memset(matx,-1,sizeof(matx));
    memset(maty,-1,sizeof(maty));
    match=0;
    hungary();
    int sum=0;
    for(int i=0;i<n;i++)
    {
        if(!p[i].isPrime)
        {
            if(matx[p[i].cno]!=-1)    sum+=p[i].grade;
        }
    }
    cout<<match<<endl;
    cout<<sum<<endl;
    //system("pause");
    return 0;
}

分享到:
评论

相关推荐

    tyvj数据库公开计划卷3

    【标题】"tyvj数据库公开计划卷3"揭示了一个关于编程竞赛平台tyvj的重要信息,该平台似乎已经关闭。在它的生命周期中,tyvj可能是一个为程序员提供在线测试和实践的平台,支持用户进行编程挑战并提升技能。"卷3"暗示...

    tyvj1126-1150测试数据数据

    "tyvj1126-1150测试数据数据"这个标题可能指的是一个特定的测试项目或活动,其中“tyvj”可能是该项目或组织的缩写,而“1126-1150”可能代表日期范围,暗示了这些测试数据是在2011年11月26日至11月50日(假设日期...

    tyvj1000-1125测试数据

    tyvj上的测试数据需要的下载。。。。。

    tyvj测试数据(1000~1099)

    【tyvj测试数据(1000~1099)】是一份专门针对TYVJ在线题库的测试资源,包含了从1000到1099编号的前一百道题目。TYVJ,全称为“Top Young Vitality Junior”,是一个面向青少年的信息学竞赛平台,提供丰富的编程题库...

    TYVJ题库P1005题 滑雪问题源代码

    标题中的“TYVJ题库P1005题 滑雪问题源代码”指的是一个编程竞赛题目,来源于TYVJ(可能是一个在线编程竞赛平台)的题库,编号为P1005,主题是“滑雪”。这个问题显然需要参赛者编写程序来解决,而提供的“解”表明...

    cpp.rar_tyvj_tyvj 1268 c

    【cpp.rar_tyvj_tyvj 1268 c】这个压缩包文件主要包含了与编程竞赛相关的资源,特别是针对“tyvj”(一个在线编程竞赛平台)的题目解答和源代码,以及可能在“poj”(又一个在线编程平台)上的一些简单题目。...

    Tyvj源代码 第一部分

    【标题】"Tyvj源代码 第一部分"涉及的是一个在线编程竞赛平台——Tyvj的源代码。Tyvj,全称“天梯算法竞赛”,是中国的一个知名编程竞技网站,旨在提供一个平台供程序员们进行算法练习和竞技。这个压缩包包含了Tyvj...

    TYVJ源代码 第二部分

    TYVJ源代码 VIJOS 源代码 (一共五部分) 此部分只包含

    TYVJ 源代码 第五部分

    TYVJ源代码 VIJOS源代码 此部分只包含题目 代码部分:http://download.csdn.net/download/a710128/7630117 一共五部分

    TYVJ 源代码 第三部分

    TYVJ源代码 VIJOS 源代码 此部分只包含题目 代码在 http://download.csdn.net/download/a710128/7630117 一共五部分

    TYVJ源代码 第四部分

    TYVJ源代码 VIJOS 源代码 此部分只包含题目 代码部分 : http://download.csdn.net/download/a710128/7630117 一共五部分

    Tyvj_p1048_田忌赛马1

    Tyvj_p1048_田忌赛马1 在这个题目中,我们可以使用贪心策略来解决,但是需要注意到存在打平的情况,这个贪心策略没有考虑到。如果出现打平的情况,两种分支的情况下要不是打平,要不然为了以后得分更高此时输掉。...

    TYVJ 源代码 第一部分(新)

    请不要再下载 ...。。。 那个有问题,现在我发一个新的 里面有一个教程(自认为写得很完整) 贴上后面几部分的地址(后面的不要分) ...如果有什么问题,请在 CSDN 上联系我

    求最大子序的4种算法

    标题中的“求最大子序”是指在给定的整数序列中找到一个连续子序列,其元素之和最大。这是一个经典的计算机科学问题,通常被称为“最大子数组问题”或“最大连续子序列和问题”。本问题的目标是设计算法来解决这个...

    vijos的本地版题库

    Vijos的本地版题库是一款专为信息学竞赛爱好者设计的离线版在线判题系统(OJ,Online Judge)。这个系统集成了超过300道经典题目,旨在帮助用户在没有网络连接的情况下也能进行编程训练和自我评测。...

    奥赛信息学在线评测网站快捷登陆

    奥赛信息学在线评测网站快捷登陆。 包含TYVJ,WIKIOI等著名评测网站

    C++代码全集

    这表明这个压缩包中的代码是作者在参与各类在线编程挑战时编写的,例如bzoj(Blue Zoo Online Judge),cojs(Codeforces),tyvj(Tianyi Online Judge),poj(Programming Online Judge)以及Usaco(USA ...

    VijosNT Mini 2.0.5.6 单机信息学评测系统

    它是基于Vijos或TYVJ(天元在线评测系统)的一个轻量级版本,旨在简化评测流程,提高效率。该系统支持多种编程语言,包括但不限于C、C++、Java和Python等,允许用户提交代码后,系统会自动编译并运行,根据预设的...

    重庆2012noip提高组day1所有选手的程序

    它不仅是一个资源库,包含了所有参赛者的程序代码,而且提供了一个便利的途径,让选手们能够将自己的源程序提交到“天元在线虚拟竞赛平台(Tyvj)”进行评估和测试。这表明,这些程序可能涉及各种编程语言,如C++, ...

Global site tag (gtag.js) - Google Analytics