欧阳逸owen
2024-10-26 22:14:40
此游记为献祭自己的第3年正式信竟生涯(虽然我很菜...)。
坐标:GD-SZ
2023年:
10.16日夜 在家突发39℃高烧 5天高烧不下 10.20勉强退烧
10.21日 J组复赛翻车(T1数组开小,T2忘开double,T3T4基本上没兴致了) 60分
2023年总结:因为一整年长时间的熬夜,我的身体明显变差了 造成我最后的失利
2024年:
1月~7月 搞学科
7.15日~8.31日 暑假集训 把提高组算法全部过了一遍 然后也将普及组算法复习了一遍
9.21日 2024CSP-J1/S1初赛稳稳过掉
10.1日~10.7日 国庆集训 不断复习 只为拿奖
10.8日~10.24日 每日下午一直集训 准备比赛
10.25日 前往GD-SZ边疆地区:SZ高级中学高中园(CCF是没钱了吗 选这种地方)
距离2024CSP-J2/S2还有-1天
开头想说的事:CCF选的学校请别太抽象
凌晨1点睡着 早上6点半起床 7点去考点(谁说会堵车的????)
7:30 进入考点,运气挺好的,第二个进考点
8:00 前往考场,进入考场
CCF为啥不让带纸巾进考场,我这种重度鼻炎患者怎么办???
8:30 CSP-J2开始。
我先在DEV上打了个模板,等到监考老师发解压码之后解压看题。
一看题面,这么大一张扑克牌图片,以为很难,结果一看题目,挖草,这不纯纯map练习题吗,直接判断一下是否标记过,没标记过的就标记,并从52张牌中减少一张需要拿的牌,标记过的不管。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
map<string,bool> mp;
ll n,ans=52;
int main(){
cin >> n;
for(int i=1;i<=n;i++){
string s;
cin >> s;
if(mp[s]==0){
mp[s]=1;
ans--;
}
}
cout << ans;
return 0;
}
一看题面,这不纯纯简单DFS搜索题吗,拿vis数组标记一下就可以了,于是,我就写出了一下代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e3+10;
char c[N][N];
ll ans;
bool vis[N][N];
ll n,m,k;
void dfs(ll x,ll y,ll d,ll temp){
// cout << x << " " << y << " " << d << " " << temp << " " << ans << endl;
if(!vis[x][y]) vis[x][y]=1;
if(temp==0){
return ;
}
if(d==0){
if(y+1>m||c[x][y+1]=='x'){
dfs(x,y,1,temp-1);
}
else dfs(x,y+1,d,temp-1);
}
else if(d==1){
if(x+1>n||c[x+1][y]=='x'){
dfs(x,y,2,temp-1);
}
else{
dfs(x+1,y,d,temp-1);
}
}
else if(d==2){
if(y-1<1||c[x][y-1]=='x'){
dfs(x,y,3,temp-1);
}
else dfs(x,y-1,d,temp-1);
}
else{
if(x-1<1||c[x-1][y]=='x'){
dfs(x,y,0,temp-1);
}
else dfs(x-1,y,d,temp-1);
}
return ;
}
ll x,y,d;
void solve(){
ans=0;
cin >> n >> m >> k;
cin >> x >> y >> d;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >> c[i][j];
vis[i][j]=0;
}
}
dfs(x,y,d,k);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]) ans++;
}
}
cout << ans << endl;
return ;
}
ll T;
int main(){
// freopen("explore.in","r",stdin);
// freopen("explore.out","w",stdout);
cin >> T;
while(T--) solve();
return 0;
}
然后测了测大样例,发现最后一个跑不过,我寻思着是不是TLE了,于是,我考场上就想了一个奇怪的假优化方法,调了接近1个半小时,才把样例重新过掉,然后发现,大样例还是跑不过,我看时间不早了,我就跳题看下一题了,代码也没改了。 代码我也不放了,上面那个代码才是正解。
第一眼,简单题目;第二眼,可以打表;第三眼,有规律!!!
我通过纯暴力算法将n=1~50的情况全部输出出来,发现了规律,所有n>20的情况,前面不一定都是8,但是除了前2位或前3位都出现了8,同时,题目中的特殊性质(保证n是7的倍数已经提醒的很明显了)
我的写法和大部分人不一样,但其实就是这个道理:除了前2位或前3位都出现了8,我只是通过暴力算的前2位和者前3位比较谁小就输出谁。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll a[N];
const ll cnt[15]={6,2,5,5,4,5,6,3,7,6};
ll T;
ll count(ll x){
ll ans=0;
ll temp=x;
while(temp){
ans+=cnt[temp%10];
temp/=10;
}
return ans;
}
ll num(ll x){
ll a=1;
while(1){
if(count(a)==x){
return a;
}
else a++;
}
return 1;
}
int main(){
cin >> T;
while(T--){
ll x;
cin >> x;
if(x<=1){
cout << -1 << endl;
continue;
}
if(x<=20){
cout << num(x) << endl;
continue;
}
ll t1=x/7-1,t2=x/7-2;
ll m1=num(x-(t1*7))*10+8;
ll m2=num(x-(t2*7));
cout << min(m1,m2);
if(m1<m2){
for(int i=1;i<=t1;i++){
cout << 8;
}
}
else{
for(int i=1;i<=t2;i++){
cout << 8;
}
}
cout << endl;
}
return 0;
}
一眼题目,感觉像是建图,但是时间不够了,直接 可以总司令
估分:100+70+100+0=270
最后15分钟,回去看T2,还是找不到为啥爆掉,时间复杂度是O(K) 不可能有问题,最后只能交上去一个有点小问题但不多的代码。
出了考场,一问为啥我T2大样例会没输出,原来是因为Windows系统会爆栈,但不是TLE,时间复杂度O(K),用我一开始写的代码都能过,哭扣40分(洛谷民间数据)。
家长们从外面打包了饭菜在食堂吃,食堂很大,很新,就是椅子怎么这么抽象,不给我们靠背。。。。
饭后总结了一下J组。
13:30 进礼堂准备进考场
14:00 进考场(爬了7层楼,真服了啊)、
14:30 CSP-S2开始
一看题面,显然的双指针,直接排序,通过双指针模拟即可,代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll a[N];
ll n;
int main(){
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
sort(a+1,a+1+n);
ll i=1,j=1;
while(i<=n&&j<=n){
if(a[i]>=a[j]){
j++;
}
else{
i++;
j++;
}
}
cout << j-i << endl;
return 0;
}
根据题面给出的公式,分类讨论每一个车的加速度a=0、a<0、a>0,算出他们速度变为V时的位置或者区间,再通过二分计算即可。 写了2小时,样例过了,但是样例组一直过不了,后面直接放弃,转成写特殊点。 代码无。
看完题目,啥也不会,直接爆搜,骗他个20分。 代码无。
看不懂题,卒。
估分:100+25+20+0=145
J组T2发挥失常了,不过确实不知道Windows会爆栈,但是Linux上就没问题,希望能有一等奖。 S组其实比预想的要好,希望有个二等奖吧。