CSP2019 开始的失败
初赛篇
初赛没什么好说的,随随便便就过了
复赛篇
考试前
考试前一直在划水,没有认真复习,现在看来结果也是自己应得的。
考试中
这是标准的水题,一次AC
民间数据成绩:100
看到这题直接想用队列做,可是最后测第二个样例发现错了
就赶快开了断点
最后发现是我理解题目出问题了,我以为优惠券如果用不了就会被丢掉
然后赶紧改过来,但最后一个样例运行了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;
}
这道题明显比第4题难,是标准的迷惑题
于是我先跳过了这题去做下一题
做完最后一题之后已经5:30
我犯了一个巨大的错误
就是
我以为考到6:30(其实是考到6:00)
我开始写深搜想骗一点分,写到一半,突然监考老师喊了一句:“距离考试结束还有5分钟”
完了,慌了
我马上打了混样例的2行代码和文件读写就准备交了
可是
我没有意识到,我本来可以骗到10分的!
请看原题:
因为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;
}
这道题一开始还以为是递推
推出“规律”时还把我开心了一会
结果发现我是错的
然后用了模拟……
万(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生涯也要走到尽头了。
就此搁笔。