第三届传智杯初赛

A.课程时间

        A - 课程报名 - 洛谷https://www.luogu.com.cn/problem/T160507第三届传智杯初赛_第1张图片

依照题意模拟即可

AC代码:

        

#include
using namespace std;
int n,v,m,a;
int ans;
int main()
{
	cin>>n>>v>>m>>a;
	int s = n/m;
	for(int i = 1;i<=s;++i)
	{
		ans+=v*m;
		v+=a;
	}
	ans+=v*(n%m);
	cout<

B- 期末考试成绩B - 期末考试成绩 - 洛谷https://www.luogu.com.cn/problem/T160508这题比第一题还水,,按照题意模拟即可。不过我有个问题为什么59分的GPA是2.6,60分的才1.0。。 

#include
using namespace std;
int n;
double ans;
int main()
{
	cin>>n;
	if(n>=90)
		ans = 4;
	if(n<60)
		n = sqrt(n)*10;
	if(n>=60&&n<90)
		ans = 4.0-((90-n)*0.1);
	printf("%.1f",ans);
	return 0;
}

C-志愿者

        C - 志愿者 - 洛谷https://www.luogu.com.cn/problem/T160509用sort排序下就行,定义一下排序规则。手写排序的小朋友一定要用快排,希尔排序,归并排序这种高级排序算法,使用冒泡插入选择会超时的哦

用结构体分别存难度,时间,志愿者编号然后一起排序就可以了

s是时间啊,k是难度,num是志愿者编号

AC代码:

#include
using namespace std;
struct node{
	int s,k,num;
}a[500005];
bool cmp(node a,node b)
{
	if(a.s*a.k!=b.s*b.k)	return a.s*a.k>b.s*b.k;
	if(a.s!=b.s)	return a.s>b.s;
	return a.num>n;
	for(int i = 1;i<=n;++i)
	{
		cin>>a[i].s>>a[i].k;
		a[i].num = i;
	}
	sort(a+1,a+1+n,cmp);
	for(int i = 1;i<=n;++i)
		cout<

D-终端

D - 终端 - 洛谷https://www.luogu.com.cn/problem/T160510本来想用map的,但是输出顺序要按输入时间输出,我用mapWA了一次就没用了,数据范围才到10e4 就按着他思路模拟就可以过了。

        一个数组存储文件名一个数组存储文件是否被删除,ls的时候看一下该点有没有被删除没被删除的输出就行了,算是暴力解法了

AC代码:

#include
using namespace std;
string first[10005];//存储文件名 
int vis[10005];//存储是否被删除 
int cnt;
string temp,fname;
int n;
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>temp;
		if(temp=="ls")
		{
			for(int i = 1;i<=cnt;++i)
				if(vis[i])//如果没被删除就输出 
					cout<>fname; 
		if(temp=="touch")
		{
			bool flag = false;
			for(int i = 1;i<=cnt;++i)
				if(first[i]==fname){//创建时如果该文件名存在直接跳过 
					flag = true;
					break;
				}
			if(flag)	continue;
			first[++cnt] = fname;//新建文件 
			vis[cnt] = 1;//标记文件未删除 
		}
		if(temp=="rm")//删除操作找到文件名直接标记为0就行 
			for(int i = 1;i<=cnt;++i)
				if(first[i]==fname)
				{
					vis[i] = 0;
					break;
				}
		if(temp=="rename")//更改找到文件名直接更改就行了 
		{
			string fname2;
			cin>>fname2;
			for(int i = 1;i<=cnt;++i)
				if(first[i]==fname)
				{
					first[i] = fname2;
					break;
				}
		}
	}
	return 0;
}

E-运气

        E - 运气 - 洛谷https://www.luogu.com.cn/problem/T160513       最基础的搜索,直接暴力枚举每一种情况就行了。时间复杂度是O(6^n)但因为n很小不会超时的

AC代码:

#include
#define ll long long
using namespace std;
const ll N = 10e9+7;
ll ans;
int n,k;
void dfs(ll now,int s)//now表示目前表示的数,s表示还有几次没甩
{
	if(s==0)
	{
		if(now%k==0)	ans++;//如果结果是k的倍数,令答案数量+1即可
		return;
	}
	for(int i = 1;i<=6;++i)
		dfs((ll)now*10+i,s-1);
}

int main()
{
	cin>>n>>k;
	dfs(0,n);
	printf("%lld",ans%N);
	return 0;
}

F-游戏:

       F - 游戏 - 洛谷https://www.luogu.com.cn/problem/T160511唯一没写出来的题,一开始考虑dp或者贪心,但是既不满足无后效性也不满足局部最优能得到全局最优,最后放弃了写这题。。后来发现可能需要建图求联通块啥的,不过没写出来就是没写出来

G-森林:

        G - 森林 - 洛谷https://www.luogu.com.cn/problem/T160512这题还行,不过我一遍AC了,(小骄傲)

具体思路代码看我博客:

        第三届传智杯初赛A组G题 - 森林_zhu_yin233的博客-CSDN博客原题链接:G - 森林 - 洛谷https://www.luogu.com.cn/problem/T160512题目背景YYH Land(Yoauld, Youthful & Happy Land)是位于炽蓝仙野的一片神奇的国度,那里的人们过着无拘无束的的快乐生活。题目描述清蒸鱼是一个尽职尽责的 YYH Land 护林者。他负责每天维护 YYH Land 的森林。在最开始的时候,YYH Land 只有一棵具有n个节点的树,每个节点有一个灵力值v。由于 Y...https://blog.csdn.net/zhu_yin233/article/details/121659778?spm=1001.2014.3001.5502

总结

        除了a组比b组多出来的两题,其他题都相当水,,F题和G题勉勉强强够得到NOIP吧,我前五题一小时以内就A完了,G题也就写了十几二十分钟这样。F题我看了十几分钟没想出来解法就放弃了。算是第四届初赛前的一个小自测吧

你可能感兴趣的:(算法,c++,图论,模拟,dfs)