hdu 2094 产生冠军

http://acm.hdu.edu.cn/showproblem.php?pid=2094

思路:

冠军只有一个,并且冠军没有被打败。

也就是说,记录下选手是否被打败过,如果最后只剩下一个人没有被打败,就能产生冠军,否则就不能。

代码和解析如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>

using namespace std;

struct node
{
    string s;
    int fail;                //fail为1表示被打败过,为0表示没有被打败过
};

int main()
{
    int n,flag1,flag2;
    vector<node> s0;

    while (cin>>n &&n!=0)
    {
        s0.clear();                //注意每次都要清零
        for (int i=0; i<n; i++)
        {
            struct node s1,s2;
            cin>>s1.s>>s2.s;
            flag1=flag2=0;
            for(int j=0;j<s0.size();j++)
            {
                if(s0[j].s==s1.s)                
flag1
=1; if(s0[j].s==s2.s) //如果已经记录过输的选手的信息,则将他标记为输 { flag2=1; s0[j].fail=1; } if(flag1==1&&flag2==1) break; } if(flag1==0) //如果没有记录过赢的选手的信息,则保存在向量中,暂且标记为赢
{
s1.fail=0;
          s0.push_back(s1);
       }
if(flag2==0) //如果没有记录过输的选手的信息,则保存进向量,并将他标记为输 { s2.fail=1; s0.push_back(s2); } } int count=0,i; for(i=0;i<s0.size();i++) { if(s0[i].fail==0) count++; } if(count==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
原文地址:https://www.cnblogs.com/yaoyueduzhen/p/4338010.html