solve函数程序详解(NOIP2004 提高组)

博客详细解析了一道NOIP2004提高组竞赛中的solve函数程序,涉及递归调用和循环嵌套。通过逐步模拟程序执行过程,展示了递归如何通过栈来实现并最终得到结果。文章鼓励读者自行计算得出程序的输出答案328。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题为笔试题的读程序题。

题目程序代码如下:

#include<iostream>
using namespace std;
int number,ndata,data[100],sum;
void solve(int s,int sign,int n){
	int i;
	for(i=s;i<ndata;i++){
		sum+=sign*(number/n/data[i]);
		solve(i+1,-sign,n*data[i]);
	}
}
int main(){
	int i;
	cin>>number>>ndata;
	sum=0;
	for(i=0;i<ndata;i++) cin>>data[i];
	solve(0,1,1);
	cout<<sum<<endl;
	return 0;
} 

输入:1000 3 5 13 11

输出:

分析:此题是典型的for循环内插入递归调用,其实也可以转换成循环嵌套。在求解此题之前可以先缩小一下规模,寻找程序运行的方式。只要找到这个子问题的方式,那么这个题也就引刃而解了。

我们不如先把规模缩小。

​
#include<iostream>
using namespace std;
int number,ndata,data[100],sum;
void solve(int s,int sign,int n){
	int i;
	for(i=s;i<ndata;i++){
		sum+=sign*(number/n);
		cout<<"1."<<sum<<
### NOIP 2012 提高试题解析 #### 题目概述 NOIP 2012 提高的比赛涵盖了多个算法领域,涉及数据结构、图论、动态规划等方面的知识。比赛分为初赛和复赛两部分,其中复赛难度较大,考察选手综合运用算法的能力。 #### 第一题:Vigenère 密码 该题主要考查字符串处理与简单加密算法的理解。给定密钥和明文,要求实现 Vigenère 加密过程并输出密文。此题属于基础题型,重点在于理解 Vigenère 表格的工作原理以及如何通过循环移位完成字符转换[^1]。 ```cpp #include <iostream> using namespace std; string encrypt(string text, string key){ int n=text.size(); for(int i=0;i<n;++i){ char c=(text[i]-'A'+key[i%key.length()]-'A')%26+'A'; text[i]=c; } return text; } int main(){ string s,k; cin>>s>>k; cout<<encrypt(s,k)<<endl; return 0; } ``` #### 第二题:国王游戏 这是一道经典的贪心算法应用题。题目描述了一个国家有 N 座城市,每座城市有一个价值 Vi 和建造成本 Ci 。现在要选出若干个城市建立宫殿,使得总收益最大。对于这类最大化利润的问题,通常可以考虑按照性价比排序后依次选取最优解直到无法继续为止。 ```cpp struct City { long long v,c; }city[1000]; bool cmp(City a,City b){return (a.v-a.c)>(b.v-b.c);} // 排序函数定义... long long solve(){ sort(city+1, city+n+1,cmp); ... } ``` #### 第三题:开车旅行 本题涉及到最短路径计算,在加权无向图上求两点间最小距离。Dijkstra 或 Floyd-Warshall 算法都是解决此类问题的有效方法之一。需要注意的是输入规模较大时应选择合适的数据结构优化性能表现。 ```cpp const int INF = 0x3f3f3f3f; vector<pair<int,int> > G[N]; // 存储边的信息... void dijkstra(int start,vector<long long>& dist){ priority_queue<pair<long long,int>, vector<pair<long long,int>>, greater<>> pq; fill(dist.begin(),dist.end(),INF); dist[start]=0;pq.push({0,start}); while(!pq.empty()){ auto [d,u]=pq.top();pq.pop(); if(d!=dist[u]) continue; for(auto &[v,w]:G[u]){ if(dist[v]>d+w){ dist[v]=d+w; pq.emplace(dist[v],v); } } } } ``` #### 第四题:疫情控制 作为压轴大题,本题不仅考验编程技巧更侧重于思维逻辑训练。面对复杂的场景设定需分解成子任务逐一击破;同时注意边界条件处理以免遗漏特殊情况造成失分。具体思路可参照官方标准解答文档获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值