总结:

这一次,最后一次,还是不行啊。

文件操作方面:没有FCLOSE,血的教训。

考场复盘:

首先一二题没什么好讲的,秒切。但是第三题由于一开始看出来是完全背包,但是好像又不是,去年又有摆渡车阴影,就先跳到了第四题。感觉还不错。但是最后还是翻车了。

先是自己做,打了个BFS过了1,2测试点,但是大数据没有输出。发现波动的规律就开始思考奇偶性,很快想到了最短路并且打完了。但其实算法里面存在极其多的纰漏。直接去的大数据,但其实小数据都做错了。大数据大部分吻合,少部分不吻合。一直改一直改下来肉眼看不出差别了,但是数据又太多,现场学了好久的cmdFC比较,下一次一定要能灵活运用才行。之后回到第三题,不会就是不会,开始骗分。

最后回到家测出来只有两百出头,但是已经没有机会了。只能在提高努力了。fclose。再也不会忘了。

题解

第一题

水题切了。

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){
int res=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
char s[];
int ans;
int main(){
for(int i=;i<=;++i){
cin>>s[i];
if(s[i]=='')ans++;
}
printf("%d",ans);
return ;
}

第二题

模拟一下,用一个数组模拟队列,再加一个标记数组是否使用。切了。

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){
int res=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
int n,w[],p[],t[];
int que[],he,ta,ans,vis[];
int main(){
n=read();
for(int i=;i<=n;++i){
w[i]=read();
p[i]=read();
t[i]=read();
while((t[i]-t[que[he]]>||vis[he]==)&&he<ta)he++;
if(w[i]==){
ans+=p[i];
que[ta++]=i;
}
else if(w[i]==){
for(int j=he;j<ta;++j){
if(p[que[j]]>=p[i]&&!vis[j]){
vis[j]=;
p[i]=;
break;
}
}
ans+=p[i];
}
}
printf("%d",ans);
return ;
}

第三题

思路

这道题,是个完全背包。说他是完全背包,却又逐渐虚玄了起来。

当时看到这道题的时候,主要把我难到的地方是:可以今天买了再等到很多天后再卖。那么着眼于这个问题,如果解决,后面就会通畅许多。

从题面可以得到,一天是可以无限进行交易的,可以买进也可以卖出。如果小伟是一个闲人,他完全可以在这一天之内无限制的买了再卖买了再卖,虽然手中的钱并没有怎么变化。

由这个假想情景可以得出:只需要考虑昨天我买进,今天我卖出,若是后面发现亏了,再买回来就行。基于这个条件,我们只需要每天做一遍完全背包,得到每天能赚的最大值,持续累积就是最终答案。

有了如上的思路就开始进行方程式的推导。

对于当前的这一天i,唯一需要考虑的条件就是这一天手上有多少的金币可以使用。而根据上一段所提到的昨天买今天卖的原则,在这一天手中是没有任何的商品的。也就是说现在手上有钱,继续昨天买今天卖就好。

所以说对于这一天的所有商品进行完全背包,结束后要得到一个用上次剩下的钱在昨天买今天卖的基础上的最大赚钱数。因此,钱是价值,也是容量。

方程式:f[k]=max(f[k],f[k-p[i-1][j]]+p[i][j]-p[i-1][j]);

P[i-1][j]就是在昨天买一件j商品所需要的代价,也就是他的价格。p[i][j]-p[i-1][j]则是今天卖出去减去昨天的价格,也就是价格差,赚的钱。

f[m]则是使用m元能挣到的最大钱数。由于是赚的钱,所以累加到m上面,作为下一次买东西的资本。当n天全部过完了,此时的m,就是答案了

注意点:天数i从2开始,不能从1.因为第一天之前没有东西可以买。

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){
int res=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
int n,t,m,p[][],f[];
int main(){
t=read();n=read();m=read();
if(t==)cout<<m;
else{
for(int i=;i<=t;++i){
for(int j=;j<=n;++j){
p[i][j]=read();
}
}
for(int i=;i<=t;++i){
memset(f,,sizeof(f));
for(int j=;j<=n;++j){
for(int k=p[i-][j];k<=m;++k){
f[k]=max(f[k],f[k-p[i-][j]]+p[i][j]-p[i-][j]);
}
}
m+=f[m];
}
printf("%d",m);
}
return ;
}

第四题

思路:

这题当时做着还是算比较有手感的。虽然最后做错了,差之毫厘。

一开始,我们可以无脑的打一遍BFS,不过只需要细心看看样例就可以发现,制造过程实在来回波动的。

什么意思呢?具体来说就是:由于我们两个是无向边,我做n阶(n>=2)的工件,你就要做n-1阶,那么我就要做n-2阶。那么于是我现在就要做n-2阶,然后又变成n-4..n-6..n-8直至你我中有一人提供原料。那么可以很简易的得出一个结论:如果n%2==0我就必须提供原料。

那么我传到一号,一号就需要做n-a段的零件。a为我到一号的某条路径长度。那么显而易见的,a越小越好,这样才可以保证n>=a。此时需要跑一遍最短路,但是只是最短路是不行的,因为说了是某条路径,换句话说,只要有一条路径使得n-a为偶数,一号就必须提供原料。那么就需要将奇偶最短路都算出来,一减,一判断就能得出答案。

多余的话:

这道题解析到现在,跑两遍单源点最短路就行。但是。一开始我读题的时候思考到一个问题,如果一号和我根本不存在路径,或者一号要做材料,但一号是个孤儿,没有任何人与他链接呢?很显然,对于第一个问题,最短路初始化是最大值,所以n<a,自动屏蔽情况。但是,面对第二个,则需要加入特判,因为这样是不可能实现的。

分层图解法

这是才学的新内容,并不能理解其中的真谛。但是面对这道题,将原图复制成两份,对于第二个复制出来的图,所有的点全部命名为a‘这样的。如果原图是1连2,那么就改成1连2’,2‘连1。

(蓝线为原图,黄线为对应关系)

(分层图的建立图示)

这样做有什么好处呢?这两个图拼在一起的话,跑一遍最短路,所有复制图上面的最短路都是奇数最短路,原图上面的最短路都是偶数最短路。这是为什么呢?是因为所有复制图上面的最短路都是由原图(偶数)转化而来的,边权又都=1,所以都是奇数。反之同理。最短由算法保证。

注意点:分层图一定要建成双向的,并且临接表的空间要开到n*4,因为是双层,双边。最后不要光判断奇偶性,还要判断长度是否合适。


分层图代码

#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int read(){
int res=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
res=res*+(ch-'');
ch=getchar();
}
return res*f;
}
const int MAXN=;
int n,m,p;
int head[MAXN],ne[*MAXN],to[*MAXN],tot;
void add(int x,int y){
to[++tot]=y;
ne[tot]=head[x];
head[x]=tot;
}
priority_queue<pair<int,int> > q;
bool vis[MAXN];
int dis[MAXN];
void dijistra(){
q.push(make_pair(,));
vis[]=;
memset(dis,/,sizeof(dis));
dis[]=;
while(!q.empty()){
int u=q.top().second;
q.pop();
vis[u]=;
for(int i=head[u];i;i=ne[i]){
int v=to[i];
if(dis[v]>dis[u]+){
dis[v]=dis[u]+;
if(!vis[v]){
vis[v]=;
q.push(make_pair(-dis[v],v));
}
}
}
}
}
int que[MAXN],s,e;
int main(){
n=read();m=read();p=read();
for(int i=;i<=m;++i){
int a,b;
a=read();b=read();
add(a,b+n);add(b,a+n);
add(a+n,b);add(b+n,a);
}
dijistra();
for(int i=;i<=p;++i){
int a,b;
a=read();b=read();
if(a==&&!head[a])printf("No\n");
else{
int k;
if(b%)k=dis[a+n];
else k=dis[a];
if(k>b)printf("No\n");
else if((b-k)%)printf("No\n");
else printf("Yes\n");
}
}
return ;
}

CSP-J总结&题解的更多相关文章

  1. leetcode题解:Construct Binary Tree from Inorder and Postorder Traversal(根据中序和后序遍历构造二叉树)

    题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume ...

  2. 【游记】CSP J/S 2019 游记

    J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...

  3. 福建工程学院第十四届ACM校赛J题题解

    第六集,想不到你这个浓眉大眼的都叛变革命了 题意: 给你两个只包含01的字符串S和T,问你在允许一次错误的情况下,T是否能成为S的子串 思路: 这个问题的解法挺多,我是用fft匹配的,也比较简单,针对 ...

  4. 【题解】【直方图】【Leetcode】Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  5. CSP J/S 2019受虐记

    一枚蒟蒻的游记~ 提高组DAY1 不是说每场考试都有一道签到题吗 那我tm读了三遍题硬是没找到一道水题是怎么回事(是我太弱了吗) 没办法,硬着头皮做T1 暴力写法...期望得分30pts 于是...在 ...

  6. J - Sushi 题解(期望dp)

    题目链接 题目大意 给你n个盘子,每个盘子可能有1,2,3个披萨 你选到每个盘子的概率是一样的. 你如果选到空的盘子什么都不做 如果你选到有披萨的盘子则吃掉一个披萨 求吃完所有披萨的期望 题目思路 设 ...

  7. Contest2037 - CSU Monthly 2013 Oct(中南大学2013年10月月赛水题部分题解)

    Problem A: Small change 题解:http://www.cnblogs.com/crazyapple/p/3349469.html Problem B: Scoop water 题 ...

  8. cgp的辣鸡比赛题解

    目录 cgp的gcd 题目链接 思路 代码 cgp调戏妹子 题目链接 思路 代码 cgp的序列 题目链接 思路 代码 cgp的背包 题目链接 思路 代码 cgp的gcd 题目链接 传送门 思路 首先看 ...

  9. [游记]2020/CSP - S总结

    2020 / C S P − S 总 结 2020/CSP - S总结 2020/CSP−S总结 这年的 C S P CSP CSP考的不是很理想,本来稳进的 C S P − J CSP-J CSP− ...

  10. Educational Codeforces Round 15 Powers of Two

    Powers of Two 题意: 让求ai+aj=2的x次幂的数有几对,且i < j. 题解: 首先要知道,排完序对答案是没有影响的,比如样例7 1一对,和1 7一对是样的,所以就可以排序之后 ...

随机推荐

  1. 栈习题(1)-对于任意的无符号的的十进制数m,写出将其转换为十六进制整数的算法(正确输出即可)

    /*对于任意的无符号的的十进制数m,写出将其转换为十六进制整数的算法(正确输出即可)*/ /* 算法思想:利用辗转取余法,每次都将余数存入栈中,直到被除数等0,退出循环. 输出栈里的内容即可 */ v ...

  2. Linux基础系统优化(一)

    前言 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和ip等参数 ifu ...

  3. Android--Bitmap处理、圆角、圆形

    /** * 转换图片成圆形 * * @param bitmap * 传入Bitmap对象 * @return */ public static Bitmap toRoundBitmap(Bitmap ...

  4. Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发

    1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...

  5. jwt 0.9.0(一)推荐jwt理由

    本人一直有良好的写技术博文的习惯,最近研究 jwt 有点点心得,赶紧记下来. 我推荐使用jwt(Json Web Token)这种客户端存储状态方式,代替传统的服务端存储状态方式(比如redis存储s ...

  6. [LOJ#3119][Luogu5400][CTS2019]随机立方体(容斥+DP)

    https://www.cnblogs.com/cjyyb/p/10900993.html #include<cstdio> #include<algorithm> #defi ...

  7. 转:JVM的符号引用和直接引用

    在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...

  8. C#使用Linq to XML进行XPath查询

    最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath.所以这里总结一下在C#中使用XPath查询XML的方法.习惯了用Linq,这里也是用的Linq to xml ...

  9. 将ftp目录映射为本地盘符

    1.ftpuser 下载安装FTPUSE下载地址:http://www.ferrobackup.com/ftpuse/ 创建  FTPUSE F: www.xx.com pwd  /USER:admi ...

  10. Java调用WebService方法总结(4)--Axis调用WebService

    Axis是比较常用的WebService框架,该项目在2006实现了最终版,后面就没有更新了.文中demo所使用到的软件版本:Java 1.8.0_191.Axis 1.4. 1.准备 参考Java调 ...