BC#92 A

本文介绍了一种算法,用于解决学生在有限条件下选择不同类型的课程以获得最大化的翘课价值的问题。通过输入课程类型及价值,算法能够计算出最大总价值。示例代码展示了如何实现这一过程。
终于又开学啦。呃喵最喜欢的就是开学了,因为这样她又可以愉快地翘课了(啊?)
呃喵接下来有n节课程需要上(换句话说,可以翘。)
每节课程有相应的课程类型与课程翘课价值。
有一点需要注意的是,呃喵不可以翘同一类课程超过两次,就是如果这类课已经翘了两次,接下来就一定要上。
问你在这个条件下,呃喵可以获得的最大翘课价值。
输入描述
第一行为一个整数T,代表数据组数。
接下来,对于每组数据——
第一行一个整数n,表示接下来需要依次上的课程数量,
接下来有n行,每行包括一个仅由'a'~'z'构成的长度不超过10的字符串s与一个正整数v。
其中字符串表示课程的类型,相同的字符串代表相同的课程。

数据保证——
1 <= T <= 1000
对于每组数据,1 <= n <= 100,1 <= |s| <= 10, 1 <= v <= 1000
输出描述
对于每组数据,输出一行。
该行有1个整数,表示呃喵可以获得的最大翘课价值。
输入样例
2
5
english 1
english 2
english 3
math 10
cook 100
2
a 1
a 2
输出样例
115
3
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 struct nood
 7 {
 8     char a[20];    
 9     int v1,v2;
10 }N[110];
11 
12 int fun(char *s,int v0,int k)
13 {
14     int q=0;
15     for(int i=1;i<k;i++)
16     {
17         if(strcmp(s,N[i].a)==0)
18         {
19             if(v0>N[i].v1&&v0<=N[i].v2)
20                 N[i].v1=v0;
21             if(v0>N[i].v2&&v0<=N[i].v1)
22                 N[i].v2=v0;
23             if(v0>N[i].v1&&v0>N[i].v2)
24             {
25                 if(N[i].v1>=N[i].v2)
26                     N[i].v2=v0;
27                 else
28                     N[i].v1=v0;
29             }
30             q=1;
31         }
32     }
33     if(q==0)
34     {
35         strcpy(N[k].a,s);
36         N[k].v1=v0;
37         return 1;
38     }
39     else
40         return 0;
41 }
42 int main()
43 {
44     int t;
45     scanf("%d",&t);
46     while(t--)
47     {
48         int n;
49         int k=1;
50         scanf("%d",&n);
51         for(int i=1;i<=n;i++)
52         {
53             N[i].v1=0;
54             N[i].v2=0;
55             strcpy(N[i].a,"0");
56         }
57         for(int i=1;i<=n;i++)
58         {
59             char s[20];
60             int v0;
61             scanf("%s%d",s,&v0);
62             int p=fun(s,v0,k);
63             if(p==1)
64                 k++;
65         }
66         int ans=0;
67         for(int i=1;i<k;i++)
68         {
69             ans=ans+N[i].v1+N[i].v2;
70         }
71         printf("%d\n",ans);
72     }
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/1778393206-qq/p/6444368.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值