CSP-J模拟赛总结(珊珊来迟了好吧)

  • T1:
    AC100pts

送分来了好吧

首先简单的处理一下大小写,把字符串和A,B的大小写统一致敬秦始皇(doge
然后再把A,B统一(就是说把A都换成B或者,B都换成A,都一样)
对了,还要来一个大小26的vis数组,统计有几个不同的字符(个人认为最简便
然后把字符串的len和cnt相乘,那AC不就来了么?

  • T2:
    AC100pts

轻轻松松一遍过

先给数组排个序,然后再给它来一层循环,遍历左边删多少数字(0~k),求最小值,输出,AC!
备注:因为排序了,而多删永远不会比少删坏,所以就当是删掉k个就行了。

  • T3:
    TLE60pts

理论上我应该能A,实际上没有

大概说一下我的思路:
预先设一个vis(接过球的球员就不能再接球了,因为那样会死循环),ans
朴实无华的Dfs,每次dfs先把ans和这次直接射门所花的时间取min
然后再遍历除目前运球球员以外的所有球员,continue掉vis[i]==1的球员,再遍历所有足球流氓,并判断是否三点共线,如果共线了就跳过这个流氓,否则就break(这层小循环),并标记为成功,然后进行下一层dfs
备注:
Q:为什么我不判断接球球员和球门的距离大于传球球员和球门的距离这种情况?
A:因为除了判断与球门的距离,还要判断传球这种情况。如果那个更远的接球球员恰好能把球传给一个和球门非常非常近的球员,而目前的传球球员因为足球流氓的原因无法传给那个人呢?这种情况也不能排除,所以不需要跳过。
提示:别忘了射门距离需要*2~

  • T4:
    TLE0pts

本来想骗一点分的,但是失败了

经过计算,这个函数的值=(n!)/(r!)
也就是(r+1)*……*n
最开始的思路是预先设一个阶乘数组,类似于sum,就是a[i]=i!%mod;
然后计算函数时,只需要计算a[n]/a[r+1]%mod;
想的挺好,但是挂的挺惨
一个样例打碎了我的AC梦,就是

1 1007
8 4

经过检查,这两个阶乘在计算前是不能%mod的,但是数据范围让我只能加上了mod
好吧,这个想法行不通
然后我就写了第二个想法,就是(r+1)*……*n的那个
开long long了,%mod了,TLE了
我觉得这个可能需要预先处理,但是我壮烈的没想出来

总结

这次考试本来我是想上300,争取T4拿到30分的,但是失败了
原因可能是我的基础知识不牢固,很多基础的题我都没写完
下一次考试我会加倍努力,争取实现目标,上300分!

640

1 个赞

有人有问题或者有人能解决我的问题吗,可以一起讨论

1 个赞

T3不是我们暑假提高大班课的第一题吗。

1 个赞

6啊,好像还真是

1 个赞

这是60分代码!!!!!!!不是AC代码!!!!!!

#include<bits/stdc++.h>
using namespace std;
int goalx,goaly,n,m;
bool vis[305];
struct place{
	int x,y;
}zz[305],lm[105];
double ans=1e9*1.0;
void dfs(int x,int y,int ii,double time){//球现在在这个坐标的ii号球员这里 
	double pt=sqrt((x-goalx)*(x-goalx)*1.0+(y-goaly)*(y-goaly)*1.0);
	ans=min(ans,time*1.0+pt*2);//直接射门 
	for(int i=2;i<=n&&i!=ii;i++){
		if(vis[i]){//去重 
			continue;
		}
		//(x,y)->(zz[i].x,zz[i].y)
		int px=zz[i].x-x,py=zz[i].y-y;
		bool cg=1;
		for(int j=1;j<=m;j++){
			int lx=lm[j].x-x,ly=lm[j].y-y;
			if(lx*1.0/(ly*1.0)==px*1.0/(py*1.0)){
				cg=0;
				break;
			}
		}
		if(cg){
			vis[i]=1;
			dfs(zz[i].x,zz[i].y,i,time+sqrt((zz[i].x-x)*(zz[i].x-x)*1.0+(zz[i].y-y)*(zz[i].y-y)*1.0));
			vis[i]=0;
		}
	}
}

int main(){
	cin>>goalx>>goaly>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>zz[i].x>>zz[i].y;
	}
	for(int i=1;i<=m;i++){
		cin>>lm[i].x>>lm[i].y;
	}
	vis[1]=1;
	dfs(zz[1].x,zz[1].y,1,0.0);
	int k=ans;
	cout<<k;
	return 0;
}
/*

*/
1 个赞

long double 试试,也有可能是精度问题

1 个赞

60分,错误样例没变

1 个赞

听不懂思密达

1 个赞

还有人问问题&要解决问题吗?