题目:
Skip the Class
Accepts: 678
Submissions: 1285
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
这是我第一次做BC,由于对STL中map容器的不熟悉,导致了我对这道题感到很束缚,完全不知怎么下手,还是要好好掌握map容器
代码1(用了普通的方法):
#include<stdio.h>
#include<string.h>
struct node
{
char s[15];
int x,y;
} G[110];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,j,m,len=0;
char s1[15];
scanf("%d",&n);
for(i=0; i<110; i++)
G[i].x=0,G[i].y=0;
for(i=0; i<n; i++)
{
int flag=0;
scanf("%s %d",s1,&m);
for(j=0; j<len; j++)
{
if(!strcmp(G[j].s,s1))
{
flag=1;
if(G[j].x<G[j].y&&G[j].x<m)
G[j].x=m;
else if(G[j].x>=G[j].y&&G[j].y<m)
G[j].y=m;
}
}
if(!flag)
strcpy(G[len].s,s1),G[len++].x=m;
}
int ans=0;
for(i=0; i<len; i++)
ans+=G[i].x+G[i].y;
printf("%d\n",ans);
}
return 0;
}
加一段官方的题解:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1001:
显然,对于每一种类型的课程,我们只会选择翘掉 翘课价值最大的前2节课。
于是,最方便的做法,是使用map<string, int>first, second来实现。
即:
for(i = 1 ~ n)
{
scanf("%s%d", s, &v);
gmax(second[s], v);
if (second[s] > first[s])swap(second[s], first[s]);
}
然后把两个map中的权值全部加到sum中即可。
--------------------------------------------------------------------------------------------------------------------------------------------------------
代码2(参考官方标程后):
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define N 200+20
#define M 100000+20
#define inf 0x3f3f3f3f
using namespace std;
map<string,int>mp;
struct node
{
char str[15];
int num;
}G[110];
bool cmp(node a,node b)
{
return a.num>b.num;
}
int main()
{
int t;
cin>>t;
while(t--)
{
mp.clear();
int n,sum=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>G[i].str>>G[i].num;
sort(G,G+n,cmp);
for(int i=0;i<n;i++)
{
if(mp[G[i].str]<2)
{
sum+=G[i].num;
mp[G[i].str]++;
}
}
cout<<sum<<endl;
}
return 0;
}
经验:要多多了解STL的用法,可以节省很多时间