Reward
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2791 Accepted Submission(s): 819
The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's reward will be at least 888 , because it's a lucky number.
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
题意:
有n(1到10000)个人与m(1到20000)个关系,每个关系都有两个数a和b,表示a的钱数必须大于b的钱数,即a>b,根据所给出的关系来输出总共所需分配的钱数最少,每人最低分配钱数为888,如果给出的关系条件无论如何都无法达到则输出-1。
思路:
拓扑排序,判断是否有环和一共有多少层,有环说明不满足关系条件,输出-1。有多少层的意思就是,一个人可以同时大于几个人的钱数,那么这几个人的钱数相同,要使钱数最少,那么这几个人的钱数比那一个人的钱数多1块即为最少。用拓扑排序的话,就是每循环一次所有的顶点,算出有多少个入度为0的点,然后这几个顶点的钱数是相同的,将这几个点删去并且将这个顶点出发所到达终点的入度-1。有环即某一次循环会出现没有入度为0的情况,一旦出现这种情况就跳出整个循环,输出-1。
AC:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 20000+5 //一开始WA了几次,发现是数组开小了 int main() { int u[MAX],v[MAX],fir[MAX],next[MAX]; int ind[MAX]; int n,m,time,temp,q,p; __int64 sum,price; //这里的钱数要用64位整型来存,要根据范围判断! while(~scanf("%d%d",&n,&m)) { memset(ind,0,sizeof(ind)); memset(fir,-1,sizeof(fir)); //输入部分 for(int i=0;i<m;i++) { scanf("%d%d",&v[i],&u[i]); next[i]=fir[u[i]]; fir[u[i]]=i; ind[v[i]]++; } // printf("\ndegree:\n"); // for(int i=1;i<=n;i++) // printf("%d ",ind[i]); // printf("\n"); // system("pause"); //测试用 price=888; sum=0; temp=1; q=1; //q代表每次删去的顶点的标记是不一样的 //为什么要不一样? while(1) { time=0; p=0; //p是为了判断当前状态是否已经全部判断完 for(int i=1;i<=n;i++) if(ind[i]<0) p++; //如果入度数组全部变为负数 //说明所有点都已经被删去 //这时候p应该等于n for(int i=1;i<=n;i++) if(!ind[i]) { time++; ind[i]=-q; } //判断有多少个入度为0的顶点 //如果判断出来该顶点入度为0,则次数+1且删去该点 // printf("\ndegree:\n"); // for(int i=1;i<=n;i++) // printf("%d ",ind[i]); // printf("\n"); // system("pause"); if(!time&&p!=n) {temp=0;break;} //判断在还未完全删去顶点之前,是否出现过全部顶点入度都不为0的情况 //即判断是否为环 if(p==n) break; //p等于n的时候,说明已经全部点都已经删去 //这时候可以跳出循环了 else { sum+=(time*price); //计算钱数 price++; //这一层已经计算完毕,单价+1 for(int k=1;k<=n;k++) { if(ind[k]==-q) { for(int x=fir[k];x!=-1;x=next[x]) ind[v[x]]--; } } //对这一层的顶点所到达终点入度-1处理 } q++; //q改变,作为标记下一层入度为0的顶点值 // printf("\ndegree:\n"); // for(int i=1;i<=n;i++) // printf("%d ",ind[i]); // printf("\n"); // system("pause"); } if(!temp) printf("-1\n"); else printf("%I64d\n",sum); } return 0; }
q的标记:
比如当输入的值为:
6 6
2 1
3 1
4 2
5 2
5 3
6 3
可以判断出,1在第一层,2和3在第二层,4,5和6在第三层。
如果每一次循环标记这一层入度都为一个固定的值-1的话,那么入度数组标记情况为:
第一次循环表示找到第一层的入度为0的顶点后删去该点;
第二次循环表示终点入度-1;
第三次循环表示删去第二层入度为0的顶点;
第四次循环本应该是对第二层顶点所到达终点入度-1的,但是因为第一层的也被标记成了-1,所以会先把第一层所达到终点的入度-1,这样的话,第二层被标记成了-2了,不再是-1了,那么第二层顶点所到达终点入度无法进行-1处理;
循环最后一次后,因为找不到入度为0的点,而且全部的数又没有变成负数,说明全部点还没被删去,那么说明有环,所以最终输出了-1这个值了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以正确标记不同层的顶点的方法应该用不同的标记,故设了个变量p值,如图:
总结:
错误最后出错比较多是在开的数组开太小了,而且sum没有用64位整型,细节方面忽略了。
相关推荐
在 Laravel 开发中,"reward" 通常指的是用户激励、积分系统或者成就系统,它用于增强用户参与度和满意度。Laravel 是一个流行的 PHP 框架,以其优雅的语法、强大的功能和丰富的生态系统而受到开发者们的喜爱。在 ...
本项目是一个名为"Reward_抽奖_"的抽奖小程序,旨在提供一个可自定义抽奖池名单、并能输出获奖人员名单的平台。通过这款小程序,主办方可以根据自己的需求设置奖池,轻松组织抽奖活动,而参与者则能体验到公平公正的...
"reward_point_full_suite_2.1b" 是一个专为Zen Cart电子商务平台设计的积分奖励系统插件。Zen Cart是一款开源的在线商店管理系统,它基于PHP语言和MySQL数据库,为商家提供了一个强大而灵活的平台来创建和管理网上...
"magento reward&points 积分插件"正是针对这一需求而设计的,它允许商家为客户的购买行为、评价或者其他互动行为授予积分,这些积分可以在未来的购物中作为货币使用或者换取特定奖励。 该插件的安装和测试过程表明...
强化学习是一种机器学习范式,旨在通过与环境的交互来学习决策策略。传统上,强化学习框架中存在两种主要的性能指标:期望累积奖励和平均奖励。然而,在某些特定的情境中,并不必然存在奖励的内在累积性或加性。...
在这个特定的场景中,我们讨论的是一个名为"J2T Reward Points + Referral Program"的积分插件,该插件是为Magento设计的,目的是增强平台的用户参与度和忠诚度。这款插件在官网的售价为400美金,但已经有人将其翻译...
1. **词汇理解**:"reward"这个词在英语中既可以作为名词,也可以作为动词。作为名词,它表示"报酬"、"报答"或"奖赏",指的是因某人的良好行为或贡献而获得的回报。作为动词,它表示"酬谢"或"奖赏",即给予他人某种...
此外,针对复杂装配过程,研究者采用模糊奖励系统(Fuzzy Reward System)来提升学习效率。模糊奖励系统能够处理连续动作控制问题中的不确定性,通过对不同情况的奖励进行模糊化,使学习过程更加鲁棒和高效。模糊...
to maximize the steady-state average reward rate of the reported data packets. We then propose an optimization model, in which one can maximize the overall steady-state average reward rate with ...
标题“reward phoot”似乎是一个拼写错误,正确应该是“reward photo”,这可能是指一种奖励或激励相关的照片,比如员工月度表彰、项目完成庆祝或者是某种成就的象征。描述中的“for month reward”进一步确认了这是...
**J2T-Reward Points: Magento 分销积分插件详解** 在Magento电子商务平台中,J2T-Reward Points是一款极具价值的插件,它能够帮助商家实现高效的客户忠诚度计划,通过积分系统来激励和奖励消费者的购买行为。这款...
在强化学习中,智能体通过试错来学习最佳行为策略,以获得最大的奖励(Reward)。本文涉及强化学习的基本概念、在真实世界应用中的困难、及其它监督学习形式等知识点。 首先,我们来解释强化学习中的“奖励”是什么...
mm_reward_qrcode_1581698008679.png
众包平台的三个参与者即任务发布者、工人和平台之间存在一定的利益冲突,因而会对众包任务的完成质量、花费、时延和平台发展产生不利影响。 从整个众包社区的长期良性发展的角度入手,设计了一种机制以统一三者的...
修改J2T Reward Points积分插件,修复在magento1910最新版下的bug,全面兼容magento1.9.1.0版本。非常强大的积分插件,价值$49的收费插件。若发现问题,请留言或评论。
标题“mm_reward_qrcode_1581698008679.rar”以及描述中的信息暗示了这是一个与二维码相关的压缩文件,可能包含了某个特定时间(1581698008679,可能是Unix时间戳)的奖励系统资料。标签“行业报告 资料”表明这可能...
Scaling Laws for Reward Model Overoptimization 本文研究了奖励模型overoptimization的scaling laws,在人工智能和强化学习领域具有重要意义。论文的主要贡献是探索了奖励模型的overoptimization问题,并研究了其...
"A Simple Way to Calculate Risk and Reward_chemical177_forex_trac"的主题正聚焦于这一核心概念,旨在帮助交易者理解如何有效评估潜在交易的风险与回报比例。这个主题不仅适用于新手交易者,也对经验丰富的交易者...
Magento Reward Points - M2 Loyalty Program 是一个专为Magento 2电子商务平台设计的客户忠诚度扩展插件。这个插件的主要目标是通过引入积分系统来增强客户的参与度和回头率,从而提高销售业绩。在本文中,我们将...
2. pages/rank:这是排行榜功能的页面,可能包含用户的积分、贡献值等数据展示,排序算法,以及动态加载等。排行榜通常会与后台数据库进行交互,获取和更新排名数据。 3. app.js和app.json:这里可能定义了全局的...