CSP2019 J组(入门级)第二轮认证题解

2019年一等奖浙江分数线为265分,二等奖分数线为100分,三等奖分数线为70分。
当年附中情况,wm为245,dyc为155,zxy为110,zzx为105,pz为100。
luogu对应题目 T1 数字游戏T2 公交换乘T3 纪念品T4 加工领奖 ,可以到luogu上查看更多题解。

T1 数字游戏 字符串

简单字符串,然后依次检查累加即可。

T2 公交换乘 模拟、队列

不少同学没看到免费搭乘一次票价不超过地铁票价的公交车,导致0分。
45分的代码

#include<bits/stdc++.h>
using namespace std;
struct T{int lei,money,time;}a[100005];
struct T1{int money,ff=0,time;}b[100005];
int main()
{
    freopen("transfer.in","r",stdin);
    freopen("transfer.out","w",stdout);
    int n,tot=0,left=0,sum=0;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i].lei>>a[i].money>>a[i].time;
    for(int i=0;i<n;i++)
    {
    	if(a[i].lei==0)
    	{
    		sum+=a[i].money;
			b[tot].money=a[i].money;
			b[tot++].time=a[i].time+45;
		}
		else
		{
			int f=0;
			for(int j=0;j<tot;j++)
			{
				if(b[j].time>=a[i].time&&b[j].money>=a[i].money&&b[j].ff==0)
				{
					f=1;
					b[j].ff=1;
					break;
				}
			}
			if(f==0)sum+=a[i].money;
		}
	}
	cout<<sum<<"\n";
    return 0;
}

用一个数组来装所有的收集到的赠票。每当坐地铁的时候,就直接花钱,然后获得一张赠票,放到数组里面。每当坐公交的时候,看看数组里面有没有时间合适,价格小于现在公交票价的赠票,并且没用过的赠票,直接用时间最早的那一张就可以了。而且45分钟后就过期了,可以用一个队列记录下这张票,这个题卡常,可以直接用数组模拟队列

T3 纪念品 背包

这个题有点难,将 每件纪念品的价格增量 作为其价值,每件纪念品在第一天购入的价格 作为其质量, M 作为背包容量,这个问题就转化为了一个完全背包问题。恭喜陈瀚东做对了

T4 加工领奖 广搜、最短路

相对来说,T4是比T3简单的。求出1到各个点的奇偶最少步数 即可。不过要使用vector代替邻接数组存储。本题杨添盛获得了满分。
若存在3->4->5->6->7->1,长度为5,那么比如重复经过点5就是7了,3->4->5->6->5->6->7->1。一条边想走几次就走几次,那么存在+2,+4,...,+2n,同奇偶。长度为6的存在吗?不确定,所以奇偶必须分开求解,最终判定条件为奇偶相同且大于等于最少步数

posted @ 2021-10-01 13:30  暴力都不会的蒟蒻  阅读(676)  评论(0编辑  收藏  举报