CCF-2017-9

来源:互联网 发布:东莞金拓软件 编辑:程序博客网 时间:2024/06/06 07:32

一、打酱油

#include "iostream"using namespace std;int main(){    int n;    cin>>n;    cout<<n/10+n/50*2+n%50/30<<endl;}

二、公共钥匙盒

#include "iostream"#include "algorithm"#include "set"using namespace std;/*思路:1、考虑到set中红黑树排序检索效率很高,可以用set集合存放某一时刻,所有要钥匙存放状态,比如ge[i]存放i时刻所有需要取出的钥匙;se[i]表示i时刻所有要存放的钥匙2、i时刻,先存钥匙,再取钥匙*/set<int> ge[10010],se[10110];int main(){    int n,k,w,s,c,max_=0;    cin>>n>>k;    int arr[n+1];     for(int i=1;i<=n;)        arr[i++]=i;    for(int i=0;i<k;i++)    {        cin>>w>>s>>c;        if(max_<s+c)            max_=s+c;        ge[s].insert(w);//所有存取状态存入对应的set集合        se[s+c].insert(w);    }    for(int i=0;i<max_+10;i++)    {        int x=1;        for(set<int>::iterator it=se[i].begin(); it!=se[i].end();++it)//i时刻,从小到大将钥匙放回        {            for(x;x<=n;x++)            {                if(arr[x]==0)                {                    arr[x]=*it;                    break;                }            }        }        for(int xx=1;xx<=n;xx++)//i时刻,取出所有需要取出的钥匙        {            if(ge[i].count(arr[xx]))            {                arr[xx]=0;            }        }    }    //输出结果    for(int i=1;i<=n;i++)        cout<<arr[i]<<" ";    return 0;}

四、通信网络

/*运行超时,用数组替换set集合,就不会运行超时了,不明白为什么?难道set集合的效率比数组低??*/#include "iostream"#include "cstring"#include "vector"#include "set"using namespace std;#define N 1000void dfs(int root,int now,int vist[]);vector<int> v[N+1];set<int> s[N+1];int n,m;void read(){    cin>>n>>m;    int a,b;    while(m--)    {        cin>>a>>b;        v[a].push_back(b);    }    for(int i=1; i<=n; i++)    {        int vist[n+1];//记录结点是否已经遍历        memset(vist,0,sizeof(vist));//头文件为cstring        dfs(i,i,vist);    }}void dfs(int root,int now,int vist[]){    vist[now]=1;    s[root].insert(now);    s[now].insert(root);    for(int i=0; i<v[now].size(); i++)    {        if(!vist[v[now][i]])        {            dfs(root,v[now][i],vist);        }    }}int count(){    int cou=0;    for(int i=1;i<=n;i++)        if(s[i].size()==n)        ++cou;    return cou;}int main(){    read();    cout<<count()<<endl;    return 0;}



#include "iostream"#include "cstring"#include "vector"#include "set"using namespace std;#define N 1000void dfs(int root,int now,int vist[]);vector<int> v[N+1];int connect[N+1][N+1];int n,m;void read(){    cin>>n>>m;    int a,b;    while(m--)    {        cin>>a>>b;        v[a].push_back(b);    }    for(int i=1; i<=n; i++)    {        int vist[n+1];//记录结点是否已经遍历        memset(vist,0,sizeof(vist));//头文件为cstring        connect[i][i]=1;        dfs(i,i,vist);    }}void dfs(int root,int now,int vist[]){    vist[now]=1;    for(int i=0; i<v[now].size(); i++)    {        if(!vist[v[now][i]])        {            connect[root][v[now][i]]=1;            connect[v[now][i]][root]=1;            dfs(root,v[now][i],vist);        }    }}int count(){    int cou=0;    for(int i=1;i<=n;i++)    {        int j;        for(j=1;j<=n;j++)        {            if(connect[i][j]==0)                break;        }        if(j==n+1)            ++cou;    }    return cou;}int main(){    read();    cout<<count()<<endl;    return 0;}