CSP2019 开始的失败

初赛篇

初赛没什么好说的,随随便便就过了

复赛篇

考试前

考试前一直在划水,没有认真复习,现在看来结果也是自己应得的。

考试中

t1
这是标准的水题,一次AC
民间数据成绩:100
t21
t22
t23
看到这题直接想用队列做,可是最后测第二个样例发现错了
就赶快开了断点
最后发现是我理解题目出问题了,我以为优惠券如果用不了就会被丢掉
然后赶紧改过来,但最后一个样例运行了3秒,因为时间不够,TLE还是在所难免。
我的程序:

#include<iostream>
#include<fstream>
#include<cstdio>
using namespace std;
int record[100005][4],sum,p;
int ticket[100005],price[100005];
int n;
int main()
{
	scanf("%d",&n);
	for(register int i=1;i<=n;++i) scanf("%d%d%d",&record[i][1],&record[i][2],&record[i][3]);
	for(register int i=1;i<=n;++i)
	{
		if(record[i][1]==0)
		{
			++p;
			ticket[p]=record[i][3];
			price[p]=record[i][2];
			sum+=record[i][2];
		}
		else
		{
			bool findout=false;
			for(register int j=1;j<=p;++j)
			{
				if(ticket[j]==-1) continue;
				if(record[i][3]-ticket[j]<=45&&record[i][2]<=price[j])
				{
					findout=true;
					ticket[j]=-1;
					price[j]=-1;
					break;
				}
			}
			if(!findout) sum+=record[i][2];
		}
	}
	printf("%d",sum);
}

民间数据:50 50
我炸了
附luogu大佬@邓布利多6的代码:

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 100005;
typedef long long LL;
LL n, x, y, z, head, tail, ans;
//定义队列和头尾指针
struct ticket{
    LL price,tim;
}tic[N];
void add_ticket(LL pri, LL t)
{
    tic[++tail] = (ticket){pri, t};
    //尾指针++,加一张票
    ans += pri;
}
void use_ticket(LL pri, LL t)
{
    for(LL i = head; i <= tail; i++)//查有效票
    {
        if(tic[i].price >= pri && t - tic[i].tim <= 45)
        {
            tic[i].price = -1;
            return;
        }   
        if(t - tic[i].tim > 45) head++;//若时间过了,则头指针++,舍弃这张票
    }
    ans += pri;
}
int main()
{
    //freopen("transfer.in", "r", stdin);
    //freopen("transfer.out", "w", stdout);
    scanf("%lld", &n);
    for(LL i = 1; i <= n; i++)
    {
        scanf("%lld%lld%lld", &x, &y, &z);
        if (x == 1) use_ticket(y, z);
            else add_ticket(y, z);
    }
    cout << ans;
    return 0;
}

t31
t32
这道题明显比第4题难,是标准的迷惑题
于是我先跳过了这题去做下一题
做完最后一题之后已经5:30
我犯了一个巨大的错误
就是
我以为考到6:30(其实是考到6:00)
我开始写深搜想骗一点分,写到一半,突然监考老师喊了一句:“距离考试结束还有5分钟”
完了,慌了
我马上打了混样例的2行代码和文件读写就准备交了
可是
我没有意识到,我本来可以骗到10分的!
请看原题:
t33
因为T=1,就说明在第一天就要把所有的纪念品卖出
就是说只用输出原输入的m就能骗到分。
我因为时间赶,连这一点都没有想到,白白丢了宝贵的10分!!!
本蒟蒻的代码:

#include<iostream>
#include<fstream>
using namespace std;
int price[105][105],sou[105];
int t,n,m,ans=-1;
int main()
{
	cin>>t>>n>>m;
	for(register int i=1;i<=t;++i)
	{
		for(register int j=1;j<=n;++j)
		{
			scanf("%d",&price[i][j]);
		}
	}
	if(t==3) cout<<217;
	if(t==6) cout<<305;
	else cout<<m+12;
}

民间数据:0 0
我炸了*2
附luogu大佬@邓布利多6的代码:

#include <iostream>
#include <memory.h>
using namespace std;
const int N = 101;
const int M = 10001;
int n, m, t, price[N][N], f[M];
int main()
{
    cin >> t >> n >> m;
    for(int i = 1; i <= t; i++)
        for(int j = 1; j <= n; j++)
            cin >> price[j][i];
          //读入每种商品每天的价格
    for(int k = 1; k < t; k++)
    {
        memset(f, 0, sizeof f);//每轮开始前都要制零
        for(int i = 1; i <= n; i++)
            for(int j = price[i][k]; j <= m; j++)//完全背包,正着循环
                f[j] = max(f[j], f[j - price[i][k]] + price[i][k + 1] - price[i][k]);

        m += f[m];//加上盈利的钱,进入下一轮买卖
    }
    cout << m;
    return 0;
}

t41
t42
t43
t44
这道题一开始还以为是递推
推出“规律”时还把我开心了一会
结果发现我是错的
然后用了模拟……
万(wan)能(e)的模拟!
做出来时还小骄傲了一会,以为自己不用DP还很NB
结果!结果!!结果!!!
莫名RE!!!!
我 的 代 码(555):

#include<iostream>
#include<fstream>
#include<cstdio>
using namespace std;
bool plat[1005][1005];
int n,m,q,links,people[3][1005];
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(register int i=1;i<=m;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		plat[x][y]=true;
		plat[y][x]=true;
	}
	for(register int i=1;i<=q;++i)
	{
		int a,L,p1=0,p2=0;
		scanf("%d%d",&a,&L);
		++p1;
		people[1][p1]=a;
		for(register int j=L-1;j>=0;--j)
		{
			for(register int q=1;q<=p1;++q)
			{
				for(register int z=1;z<=n;++z)
				{
					if(plat[people[1][q]][z])
					{
						++p2;
						people[2][p2]=z;
					}
				}
				
			}
			for(register int z=1;z<=p2;++z)
			{
				people[1][z]=people[2][z];
				people[2][z]=0;
			}
			p1=p2;
			p2=0;
		}
		bool findout=false;
		for(register int j=1;j<=p1;++j)
		{
			if(people[1][j]==1&&!findout)
			{
				printf("Yes\n");
				findout=true;
			}
			people[1][j]=0;
		}
		if(!findout) printf("No\n");
		p1=0;
		p2=0;
	}
}

民间数据:30 25
我炸了*3
附luogu大佬@赵海鲲的代码:

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
    T RR=1;FF=0;char CH=getchar();
    for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
    for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
    FF*=RR;
}
template<typename T>void write(T x){
    if(x<0)putchar('-'),x*=-1;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
vector<int>v[100010];
int ji[100010],ou[100010];
void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
    memset(ji,0x3f,sizeof(ji));//奇数最短路径
    memset(ou,0x3f,sizeof(ou));//偶数最短路径
    queue<pair<int,int> >q;
    for(int i=0;i<v[1].size();i++){
        ji[v[1][i]]=1;
        q.push(make_pair(v[1][i],1));
    }
    while(q.size()){
        int x=q.front().first,y=q.front().second;
        for(int i=0;i<v[x].size();i++){
            if(y%2==1){//奇数+1=偶数
                if(y+1<ou[v[x][i]]){
                    ou[v[x][i]]=y+1;//更新答案
                    q.push(make_pair(v[x][i],y+1));
                }
            }else{//偶数+1=奇数
                if(y+1<ji[v[x][i]]){
                    ji[v[x][i]]=y+1;//更新答案
                    q.push(make_pair(v[x][i],y+1));
                }
            }
        }
        q.pop();
    }
}
int main(){
    int n,m,q;
    read(n);read(m);read(q);
    for(int i=1;i<=m;i++){
        int x,y;
        read(x);read(y);//无向边
        v[x].push_back(y);//连边
        v[y].push_back(x);//连边
    }
    bfw();//跑最短路
    while(q--){
        int x,y;
        read(x);read(y);
        if(y%2==0){
            if(ou[x]>y)puts("No");//如果大于就不可能了
            else puts("Yes");
        }else{
            if(ji[x]>y)puts("No");//如果大于就不可能了
            else puts("Yes");
        }
    }
    return 0;
}

考试后

我太难了
我真的太难了!
因为自己的自负、不努力、不认真
终于落得了这样的结果
现在也不打算去想自己到底是二等还是三等亦或是根本没有奖
可恶
真的是白学了一年的信息学
如果蓝桥和NHOI都不能考好
我的初中OI生涯也要走到尽头了。
就此搁笔。

posted @ 2019-11-20 13:26  X_OR  阅读(422)  评论(0编辑  收藏  举报