第36次ccf-csp题解(思维)

  • 比赛感受

这会刚打完上海icpc,比起区域赛的题,这个简单太多了。
感受还不错,写的很顺手。除了第3题,其他3题都是一发过。
刷题得长期刷。





 
 

  • A题 移动

题意:f : y+1 ;  b : y-1 ;   l : x-1 ;  r : x+1

 
一个简单的模拟,若当前操作使机器人移出场地,那么使机器人移回来就好


   
   
#include <bits/stdc++.h>
#define int long long
using namespace std;
void ooo(int x){
cout<<x<<'\n';
}
signed main()
{
int n, k;cin>>n>>k;
for(int i=1;i<=k;i++){
int x, y;cin>>x>>y;
string s;cin>>s;
int len=s.size();
for(int j=0;j<len;j++){
if(s[j]=='f')y+=1;
else if(s[j]=='b')y-=1;
else if(s[j]=='l')x-=1;
else x+=1;
if(y>n)y--;
if(y<1)y++;
if(x>n)x--;
if(x<1)x++;
}
cout<<x<<' '<<y<<'\n';
}
return 0;
}

  • B题 梦境巡查

这个题不算太难,有点思维,对码力要求不高。

  

它假设当bi为0时求初始时要带的最小补给。

关键在于怎样维护bi=0时,全程中所拥有补给的最小量(为负数表示还需要多少补给) 所以就是一个单点修改,以bi为分界处,维护前半段和后半段最小值,对两段最小值取最小值,为负数则取绝对值,为非负数则为0。

   


   
   
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmmm=2e5+10;
int a[xmmm], b[xmmm];
int c[xmmm];
int sum[xmmm];
int pmi[xmmm], lmi[xmmm];
int ans[xmmm];
void ooo(int x){
cout<<x<<'\n';
}
signed main()
{
int n;cin>>n;
for(int i=0;i<=n;i++){
cin>>a[i];
c[i*2+1]=0-a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
c[i*2]=b[i];
}
pmi[0]=lmi[2*n+2]=0-1e10;
for(int i=1;i<=2*n+1;i++){
sum[i]=sum[i-1]+c[i];
}
for(int i=1;i<=2*n+1;i++){
if(i==1)pmi[i]=sum[i];
else pmi[i]=min(pmi[i-1], sum[i]);
}
for(int i=2*n+1;i>=1;i--){
if(i==2*n+1)lmi[i]=sum[i];
else lmi[i]=min(lmi[i+1], sum[i]);
}
for(int i=1;i<=n;i++){
int pos=i*2;
int t1=pmi[pos-1];
int t2=lmi[pos]-b[i];
ans[i]=min(t1, t2);
}
for(int i=1;i<=n;i++){
if(ans[i]<0)cout<<0-ans[i]<<' ';
else cout<<0<<' ';
}
return 0;
}
/*
3
5 5 5 5
0 100 0
3
9 4 6 2
9 4 6
*/

  • D题 跳房子

这个题感觉还没有C题难。
这其实是一个很简单的图遍历的问题
建完边还是只有一个前驱的这种,简单版的迪杰斯特拉。
处理出b数组,每个点只入队列一次。


   
   
#include <bits/stdc++.h>
//#define int long long
using namespace std;
void ooo(int x){
cout<<x<<'\n';
}
struct p{
int id, num;
};
const int xmmm=2e5+10;
int a[xmmm], b[xmmm], k[xmmm];
int dis[xmmm];
bool vis[xmmm];
signed main()
{
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=i-a[i];
}
for(int i=1;i<=n;i++)cin>>k[i];
int pos=0;
queue<p>q;
//q.clear();
q.push(p{1, 0});
int ans=-1;
while(!q.empty()){
p t=q.front();q.pop();
if(vis[t.id])continue;
vis[t.id]=1;
if(t.id==n){
ans=t.num;break;
}
int x=t.id;
if(x+k[x]<=pos)continue;
if(x+k[x]>=n){
q.push(p{n, t.num+1});
continue;
}
for(int i=max(pos+1, x+1);i<=min(n, x+k[x]);i++){
q.push(p{b[i], t.num+1});
}
pos=max(pos, x+k[x]);
}
cout<<ans<<'\n';
return 0;
}
/*
5
0 1 2 3 0
3 4 4 10 15
10
0 1 1 1 1 3 1 0 3 0
2 4 5 4 1 4 1 3 5 3
*/

  • C题 缓存模拟


一个大模拟按他的要求来就好了,详细的可以看注释


   
   
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xxx=3e5;
const int xx=7e4;
int head[xxx],nnum[xxx];
// m组里有多少个
struct p{
int x, y;
};
vector<p>ans;
void ooo(int x){
cout<<x<<'\n';
};
struct node {
int id, num;
bool operator<(const node &a)const {return a.num<num;}
};
priority_queue<node>qq[xx];
unordered_map<int, int>a, vis; // 位置//是否修改
signed main()
{
int n, m, q;cin>>n>>m>>q;
for(int i=1;i<=q;i++){
int x, y;cin>>x>>y;
if(a[y]){ / /判断是否命中
int pos=(y / n ) %m;
head[pos]++;
qq[pos].push(node{y, head[pos]});
a[y]=head[pos];
if(x==0)x=x;
else {
vis[y]=1; //判断是否改写
}
}
else {
int pos=( y / n )%m; //位置
if(nnum[pos]==n){ //如果已经满了
while(!qq[pos].empty()){
node tt=qq[pos].top();qq[pos].pop();
if(a[tt.id]!=tt.num)continue;
if(vis[tt.id]){
//cout<<"pos"<<tt.id<<' '<<tt.num<<' '<<a[tt.id]<<'\n';
ans.push_back(p{(int)1, tt.id});
vis[tt.id]=0;
}
head[pos]++;
a[y]=head[pos];
if(x)vis[y]=1;
qq[pos].push(node{y, head[pos]});
ans.push_back(p{(int)0, y});
a[tt.id]=0;break;
}
}
else {
head[pos]++;
a[y]=head[pos];
nnum[pos]++;
qq[pos].push(node{y, head[pos]});
if(x)vis[y]=1;
ans.push_back(p{(int)0, y});
}
}
}
int len=ans.size();
for(int i=0;i<len;i++){
cout<<ans[i].x<<' '<<ans[i].y<<'\n';
}
return 0;
}
/*
4 8 8
0 0
0 1
1 2
0 1
1 0
0 32
1 33
0 34
1 1 3
1 0
1 1
0 2
*/

  • 自我总结

这次写题的顺序是1243,再写一点点。

原创作者: 1747176348mi 转载于: https://www.cnblogs.com/1747176348mi/p/18623758
《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能包括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
### CCF-CSP 第35认证第三题的题目分析与解法 关于CCF-CSP第35认证中的第三题,目前公开的具体题目描述尚未广泛传播于网络资源中[^1]。然而,基于以往CSP认证的特点以及考生反馈的信息,可以推测该类题目通常考察的是编程基础能力和逻辑思维能力[^2]。 #### 可能涉及的知识点 此类题目往往围绕以下几个方面展开: - **数据结构**:如数组、链表、栈、队列等基本操作。 - **算法设计**:包括但不限于贪心算法、动态规划、二分查找等常见方法。 - **字符串处理**:对于输入输出格式的要求较高,需注意边界条件和特殊情况下的行为。 下面给出一个假设性的例子来说明如何解答类似的竞赛问题: 假定本题是一个简单的区间覆盖或者路径优化问题,则解决方案如下所示: ```cpp #include <bits/stdc++.++.h> using namespace std; int main(){ int n; cin >> n; // 输入n表示有多少个区域或节点 vector<pair<int, int>> intervals(n); for(auto &p : intervals){ cin >> p.first >> p.second; // 每组两个数代表起点终点坐标 } sort(intervals.begin(), intervals.end()); long long res = 0; int last_end = INT_MIN; for(const auto &[start,end]:intervals){ if(start>last_end){ res += end-start; last_end=end; } else{ if(end>=last_end){ res+=end-last_end; last_end=end; } } } cout<<res<<endl;// 输出最终结果即总长度或其他目标函数值 } ``` 上述代码片段展示了当面对连续区间的合并计算时的一种通用策略——通过排序并遍历所有给定区间实现最优求解过程[^3]。 #### 注意事项 在参加正式比赛前务必熟悉评测环境配置参数限制情况(时间复杂度O()要求),同时也要关注细节部分比如是否有负权边存在等问题影响到具体实现方式的选择上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值