• 奖金


    Description

    由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。
      于是Mr.Z下令召开m方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工a的奖金应该比b高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元。

    Input

    两个整数n,m,表示员工总数和代表数;
    以下m行,每行2个整数a,b,表示某个代表认为第a号员工奖金应该比第b号员工高。

    Output

    若无法找到合法方案,则输出“-1”;否则输出一个数表示最少总奖金。

    Sample Input

    2 1
    1 2
    Sample Output

    201
    Hint

    80%的数据满足n<=1000,m<=2000;
    100%的数据满足n<=10000,m<=20000。

    .
    .
    .
    .
    .
    .
    分析
    正解:拓扑排序
    数据过水,可用深搜。
    数组竟开这么大能过

    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int n,m,c[10010],a[10010][10],s[10010],bz=0;
    bool f[10010];
    
    void dfs(int i,int money)
    {
    	if (s[i]<=money) s[i]=money+1; else return;
    	f[i]=true;
    	for (int j=1;j<=c[i];j++) 
    		if (f[a[i][j]]==false) dfs(a[i][j],s[i]); else
    		{
    			printf("-1");
    			bz=1;
    			return;
    		}
     	f[i]=false;
    }
    
    int main()
    {
    	freopen("reward.in","r",stdin);
    	freopen("reward.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
    	{
    		int u,v;
            scanf("%d%d",&u,&v);
            c[v]++;
            a[v][c[v]]=u;
        }
       	for (int i=1;i<=n;i++)
       		dfs(i,99);
       	int ans=0;
       	for (int i=1;i<=n;i++)
       		ans+=s[i];
        if (bz==0) printf("%d",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    
  • 相关阅读:
    共用体
    建立动态链表
    动态分配储存与链表
    结构指针变量作函数参数
    R语言实战 第7章
    R-6 线性回归模型流程
    R-5 相关分析-卡方分析
    R-4 方差分析
    R-3 t分布--t置信区间--t检验
    R-2
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/11094918.html
Copyright © 2020-2023  润新知