Groups
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1201 Accepted Submission(s): 470
Problem Description
After the regional contest, all the ACMers are walking alone a very long avenue to the dining hall in groups. Groups can vary in size for kinds of reasons, which means, several players could walk together, forming a group.
As the leader of the volunteers, you want to know where each player is. So you call every player on the road, and get the reply like “Well, there are Ai players in front of our group, as well as Bi players are following us.” from the ith player.
You may assume that only N players walk in their way, and you get N information, one from each player.
When you collected all the information, you found that you’re provided with wrong information. You would like to figure out, in the best situation, the number of people who provide correct information. By saying “the best situation” we mean as many people as possible are providing correct information.
As the leader of the volunteers, you want to know where each player is. So you call every player on the road, and get the reply like “Well, there are Ai players in front of our group, as well as Bi players are following us.” from the ith player.
You may assume that only N players walk in their way, and you get N information, one from each player.
When you collected all the information, you found that you’re provided with wrong information. You would like to figure out, in the best situation, the number of people who provide correct information. By saying “the best situation” we mean as many people as possible are providing correct information.
Input
There’re several test cases.
In each test case, the first line contains a single integer N (1 <= N <= 500) denoting the number of players along the avenue. The following N lines specify the players. Each of them contains two integers Ai and Bi (0 <= Ai,Bi < N) separated by single spaces.
Please process until EOF (End Of File).
In each test case, the first line contains a single integer N (1 <= N <= 500) denoting the number of players along the avenue. The following N lines specify the players. Each of them contains two integers Ai and Bi (0 <= Ai,Bi < N) separated by single spaces.
Please process until EOF (End Of File).
Output
For each test case your program should output a single integer M, the maximum number of players providing correct information.
Sample Input
3 2 0 0 2 2 2 3 2 0 0 2 2 2
Sample Output
2 2HintThe third player must be making a mistake, since only 3 plays exist.
题意:在一个队列中,可能有多个人并排的情况,每个人要报出他前面和后面各有多少人,问最多有多少人说的是正确的。
思路:先算出s[q][h]的数量,然后dp[i][j]表示当i+1到j的人是并排时前j个人最多有多少是正确的。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,dp[510][510],num[510][510],f[510];
int main()
{
int i,j,k,q,h,ans;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
scanf("%d%d",&q,&h);
if(q+h<n)
{
num[q][h]++;
if(num[q][h]>n-q-h)
num[q][h]=n-q-h;
}
}
for(j=1;j<=n;j++)
for(i=0;i<j;i++)
{
dp[i][j]=f[i]+num[i][n-j];
if(dp[i][j]>f[j])
f[j]=dp[i][j];
}
ans=0;
for(i=0;i<n;i++)
ans=max(ans,dp[i][n]);
printf("%d\n",ans);
}
}

本文探讨了一个队伍中玩家报告前方和后方人数的场景,通过算法计算最多有多少人提供正确信息。利用动态规划解决实际问题,提供详细步骤和代码实现。
3万+

被折叠的 条评论
为什么被折叠?



