CCF CSP 2017·03

做了一段时间的CCF CSP试题,个人感觉是这样分布的

  • A、B题基本纯暴力可满分
  • B题留心数据范围
  • C题是个大模拟,留心即可
  • D题更倾向于图论?(个人做到的D题基本都是图论)
  • E题就是神仙打架了

A:分蛋糕

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define dd(x) cout<<#x<<'='<<x<<", "
#define de(x) cout<<#x<<'='<<x<<endl
typedef long long ll;
const int maxn = 1e5+5; int num[maxn]; int main()
{
int n,m;
scanf("%d%d",&n,&m);
rep(i,1,n+1) num[i] = i;
while(m--)
{
int p,q;
scanf("%d%d",&p,&q);
int pos = 1;
while(num[pos]!=p) pos++;
if(q>0){
for(int i=pos;i<pos+q;i++) num[i] = num[i+1];
num[pos+q] = p;
}
else{
for(int i=pos;i>pos+q;i--) num[i] = num[i-1];
num[pos+q] = p;
}
}
rep(i,1,n+1) printf("%d%c",num[i],i==n?'\n':' ');
}

B:学生排队

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define dd(x) cout<<#x<<'='<<x<<", "
#define de(x) cout<<#x<<'='<<x<<endl
typedef long long ll;
const int maxn = 1e5+5; int num[maxn]; int main()
{
int n,m;
scanf("%d%d",&n,&m);
rep(i,1,n+1) num[i] = i;
while(m--)
{
int p,q;
scanf("%d%d",&p,&q);
int pos = 1;
while(num[pos]!=p) pos++;
if(q>0){
for(int i=pos;i<pos+q;i++) num[i] = num[i+1];
num[pos+q] = p;
}
else{
for(int i=pos;i>pos+q;i--) num[i] = num[i-1];
num[pos+q] = p;
}
}
rep(i,1,n+1) printf("%d%c",num[i],i==n?'\n':' ');
}

C:Markdown

  • 段落之间分情况处理
  • 段内采用递归式处理(同一行写了好长,不好看...)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define dd(x) cout<<#x<<'='<<x<<", "
#define de(x) cout<<#x<<'='<<x<<endl
typedef long long ll;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
void open(){freopen("data.txt", "r", stdin);} // 单独处理每一行
string format_line(string str)
{
int len = str.size();
string res;
rep(i,0,len){
// 处理强调
if(str[i]=='_'){
int j = i+1;
while(str[j]!='_') j++;
// 递归处理
res = str.substr(0, i).append("<em>").append(format_line(str.substr(i+1, j-i-1))).append("</em>").append(format_line(str.substr(j+1, len-j-1)));
return res;
}
// 处理超链接
else if(str[i]=='['){
int j = i+1;
while(str[j]!=']') j++;
int p = j+1;
int q = p+1;
while(str[q]!=')') q++;
// 递归处理
res = str.substr(0, i).append("<a href=\"").append(format_line(str.substr(p+1, q-p-1))).append("\">").append(format_line(str.substr(i+1, j-i-1))).append("</a>").append(format_line(str.substr(q+1, len-q-1)));
return res;
}
}
return str;
} // 处理#打头的行
void func_comment(string line)
{
int len = line.size();
int cnt = 0;
int p = 0;
while(line[p]=='#' && p<len){
cnt++;
p++;
}
while(line[p]==' ' && p<len) p++;
cout<<"<h"<<cnt<<">"<<format_line(line.substr(p, len-p))<<"</h"<<cnt<<">"<<endl;
// 寻找第一个不是空格的位置
} // 处理*打头的行
void func_star(string line)
{
int len = line.size();
int p = 0;
while(line[p]==' ' || line[p]=='*') p++;
cout<<"<li>"<<format_line(line.substr(p,len-p))<<"</li>"<<endl;
} int main()
{
//open();
string line;
while(getline(cin, line))
{
bool newp = true;
bool newlist = true;
if(line.size()==0){
//puts("00000");
continue;
}
else if(line[0]=='#'){
//puts("######");
func_comment(line);
}
else if(line[0]=='*'){
//puts("*******");
puts("<ul>");
func_star(line);
// 连续不断输入 直到处理完无序列表
while(getline(cin, line))
{
if(line.size()>0 && line[0]=='*') func_star(line);
else break;
}
puts("</ul>");
}
else{
//puts("ppppppppp");
cout<<"<p>";
cout<<format_line(line);
bool flag = false;
while(getline(cin, line)){
if(line.size()==0){
flag = true;
cout<<"</p>"<<endl;
break;
}
cout<<endl;
cout<<format_line(line);
}
if(!flag) cout<<"</p>"<<endl;
}
}
}

D:地铁修建

  • 看走了眼本来还以为是个简单的“单源最短路”问题,仔细一看是“最小化路径上的最大值”问题
  • 直觉是max()函数拥有和加法一样的单调不减性质(非负数加法),可以直接在单源最短路径问题上修改
  • 也就是将dist[v] = dist[u] + cost变成dist[v] = max(dist[u], cost)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define dd(x) cout<<#x<<'='<<x<<", "
#define de(x) cout<<#x<<'='<<x<<endl
typedef long long ll;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f; struct Edge
{
int v;
int cost;
Edge(int _v=0, int _cost=0):v(_v), cost(_cost){}
}; vector<Edge> E[maxn];
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
bool vis[maxn];
int cnt[maxn];
int dist[maxn];
bool SPFA(int start, int n)
{
memset(vis, 0, sizeof(vis));
rep(i,1,n+1) dist[i] = INF;
vis[start] = true;
dist[start] = 0;
queue<int> que;
while(!que.empty()) que.pop();
que.push(start);
cnt[start] = 1;
while(!que.empty())
{
int u = que.front();
que.pop();
vis[u] = false;
rep(i,0,E[u].size()){
int v = E[u][i].v;
int cost = E[u][i].cost;
// 这里修改了两行
if(dist[v]>max(dist[u],cost)){
dist[v] = max(dist[u], cost);
if(!vis[v]){
vis[v] = true;
que.push(v);
if(++cnt[v]>n) return false;
}
}
}
}
return true;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
int u,v,w;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
SPFA(1,n);
printf("%d\n", dist[n]);
}

CCF CSP 201703的更多相关文章

  1. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  2. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  3. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  4. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  5. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  6. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  7. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  8. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  9. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

随机推荐

  1. HDU 1358 Period(KMP+最小循环节)题解

    思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> ...

  2. 【第五章】 springboot + mybatis

    springboot集成了springJDBC与JPA,但是没有集成mybatis,所以想要使用mybatis就要自己去集成.集成方式相当简单. 1.项目结构 2.pom.xml <!-- 与数 ...

  3. stm32 iic读取mpu6050失败 改用串口

    mpu6050使用iic一直失败.放弃治疗,使用串口... #include "led.h" #include "mpu6050.h" #include &qu ...

  4. POJ 1029 False coin

    http://poj.org/problem?id=1029 题意: 在一堆硬币中有一个假硬币,重量是重是轻不知道.每次称量多个硬币,并给出称量结果.判断依据题目给出的几次称量结果能否找出假硬币. 思 ...

  5. Linux command line exercises for NGS data processing

    by Umer Zeeshan Ijaz The purpose of this tutorial is to introduce students to the frequently used to ...

  6. hdu 1796 How many integers can you find 容斥定理

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. python 重复元素排序

    def counting_sort(array1, max_val): m = max_val + count = [] * m for a in array1: # count occurences ...

  8. chrome的url列表里面也找不到chrome://plugins的原因

    plugins 页面被移除后,可以访问: chrome://settings/content 调整 Flash.PDF 的设置. 原本 plugins 页面就基本只剩下这两货了,移除掉确实没啥影响. ...

  9. Android开机广播和关机广播

    有些时候我们需要我们的程序在系统开机后能自动运行,这个时候我们可以使用Android中的广播机制,编写一个继承BroadcastReceiver的类,接受系统启动关闭广播.代码如下: /** *@au ...

  10. C++学习笔记(一)——一个字符串分割和统计的工具(TextUtils)

    第一讲先从一个实例开始——我们需要完成一个遍历文件并统计单词出现次数的任务.分解功能:首先,按行读取文件并舍弃可能的空行.其次,将每一行都按照空格划分单词.因为可能存在标点符号,我们还需要将标点符号都 ...