Codeforces 2A - Winner模拟题
2018-03-01 18:57
453 查看
这题,读懂题是关键。
题意:找到最终结果时分数是最大的,当有多个时,找到值最先大于等于最大值的人
过程:模拟俩次过程,第一次求最大值,第二次求最先到达者。
我写了两个代码,均带有注释,第一个是不用map函数的直接模拟的适合初学者阅读,另外一个是用map函数的短小精炼 在第一个代码后面。
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct namea{
char name[33];
int num;
int ans;
}A[1001],B[1001];
int num[1001];
int main()
{ //大数组,先存下来。
//每访问一次 每个人检索一轮下来 找之前是否出现过没出现+1 出现加值
//找到了最大值
//从头开始检索 找到最先出现的
//复杂度(1000+1)*500
int t,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++)
scanf("%s%d",B[i].name,&B[i].num);
int x=1;
for(i=1;i<=t;i++)A[i].num=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=i;j++)
{
if(strcmp(B[i].name,A[j].name)==0)break;
}
if(j>i)//未出现过
{
strcpy(A[x].name,B[i].name);
A[x].num+=B[i].num;x++;
}
else //出现过了
{
A[j].num+=B[i].num;
}
}
int max=0;
for(i=1;i<=x;i++)if(max<A[i].num)max=A[i].num;
bool flag=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=x;j++)
{
if(strcmp(B[i].name,A[j].name)==0)
{
A[j].ans+=B[i].num;
if(A[j].ans>=max&&A[j].num==max)flag=1;
break;
}
}
if(flag)break;
}
printf("%s\n",A[j].name);
}
使用map函数的 AC代码:
#include<bits/stdc++.h>
using namespace std;
char a[1010][55];
int n[2005],m,maxi;
int main()
{
map<string,int>map1,map2;
scanf("%d",&m);
{
maxi=-1000;
for(int i=0;i<m;++i)scanf("%s%d",a[i],&n[i]),map1[a[i]]+=n[i];
//加入map1 名字和值
for(int i=0;i<m;++i)if(map1[a[i]]>maxi)maxi=map1[a[i]];
//map1里的那个人的名字就有这个这个值 进行比较即可,找到最大值
for(int i=0;i<m;++i)
{
map2[a[i]]+=n[i];
if(map2[a[i]]>=maxi&&map1[a[i]]==maxi){printf("%s\n",a[i]);break;}
}
//第二张地图找到最先出现的大于等于最大值的数,并且最后的这个值是等于最大的
//如果不注意后面的数会变小 就会案例过不掉,因为有一些值后来会不是最大的
}
}
题意:找到最终结果时分数是最大的,当有多个时,找到值最先大于等于最大值的人
过程:模拟俩次过程,第一次求最大值,第二次求最先到达者。
我写了两个代码,均带有注释,第一个是不用map函数的直接模拟的适合初学者阅读,另外一个是用map函数的短小精炼 在第一个代码后面。
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct namea{
char name[33];
int num;
int ans;
}A[1001],B[1001];
int num[1001];
int main()
{ //大数组,先存下来。
//每访问一次 每个人检索一轮下来 找之前是否出现过没出现+1 出现加值
//找到了最大值
//从头开始检索 找到最先出现的
//复杂度(1000+1)*500
int t,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++)
scanf("%s%d",B[i].name,&B[i].num);
int x=1;
for(i=1;i<=t;i++)A[i].num=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=i;j++)
{
if(strcmp(B[i].name,A[j].name)==0)break;
}
if(j>i)//未出现过
{
strcpy(A[x].name,B[i].name);
A[x].num+=B[i].num;x++;
}
else //出现过了
{
A[j].num+=B[i].num;
}
}
int max=0;
for(i=1;i<=x;i++)if(max<A[i].num)max=A[i].num;
bool flag=0;
for(i=1;i<=t;i++)
{
for(j=1;j<=x;j++)
{
if(strcmp(B[i].name,A[j].name)==0)
{
A[j].ans+=B[i].num;
if(A[j].ans>=max&&A[j].num==max)flag=1;
break;
}
}
if(flag)break;
}
printf("%s\n",A[j].name);
}
使用map函数的 AC代码:
#include<bits/stdc++.h>
using namespace std;
char a[1010][55];
int n[2005],m,maxi;
int main()
{
map<string,int>map1,map2;
scanf("%d",&m);
{
maxi=-1000;
for(int i=0;i<m;++i)scanf("%s%d",a[i],&n[i]),map1[a[i]]+=n[i];
//加入map1 名字和值
for(int i=0;i<m;++i)if(map1[a[i]]>maxi)maxi=map1[a[i]];
//map1里的那个人的名字就有这个这个值 进行比较即可,找到最大值
for(int i=0;i<m;++i)
{
map2[a[i]]+=n[i];
if(map2[a[i]]>=maxi&&map1[a[i]]==maxi){printf("%s\n",a[i]);break;}
}
//第二张地图找到最先出现的大于等于最大值的数,并且最后的这个值是等于最大的
//如果不注意后面的数会变小 就会案例过不掉,因为有一些值后来会不是最大的
}
}
相关文章推荐
- Codeforces 2A. Winner(字符串:模拟)
- CodeForces 2A - Winner(模拟)
- CODEFORCES 2A-Winner
- CodeForces 2A. Winner
- Codeforces 2A Winner (map运用)
- codeforces 2A-Winner (map)
- Codeforces 2A-Winner(模拟)
- codeforces - 2A - Winner
- CodeForces 2A-Winner
- CodeForces - 2A - Winner
- CodeForces 2A - Winner(模拟)
- codeforces 2A Winner
- codeforces 2A Winner (好好学习英语)
- Codeforces 2A :winner
- [codeforces] 2A - Winner
- CodeForces 2A Winner
- CodeForces 2A Winner(CodeForces的题意总是那么难理解)——Codeforces Beta Round #2
- Codeforces 2A :winner
- Codeforces 2A Winner
- Codeforces 2A Winner (STL map使用)