1121. Damn Single (25)

当时考试的时候,set::find忘记怎么用了。。。。然后直接从头到位遍历的。。。当然超时了。。。丢了8分,其实是看到最后一题是AVL Tree就没有用剩下的时间去猜find函数怎么用。。。

30都丢了,考多少也就无所谓了

find是用红黑树,时间复杂度log2n

今天写了一下,一A,意料之中

复习一下set中常见函数用法吧

#include<iostream>
#include<set>
using namespace std;
const int MAX = 100000;
int n , m ;
int guests[MAX]={0};
set<int> all_guests;
set<int> longly_guests;
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		int a , b ;
		scanf("%d%d",&a,&b);
		guests[a]=b;
		guests[b]=a;
	}
	cin>>m;
	for(int i=0;i<m;i++){
		int c;
		scanf("%d",&c);
		all_guests.insert(c);
	}
	for(set<int>::iterator it=all_guests.begin();it!=all_guests.end();it++){
		if(all_guests.find(guests[*it])!=all_guests.end()){
		}
		else{
			longly_guests.insert(*it);
		}
	}
	cout<<longly_guests.size()<<endl;
	for(set<int>::iterator it=longly_guests.begin();it!=longly_guests.end();it++){
		if(it!=longly_guests.begin()) printf(" ");
		printf("%05d",*it);
	}
	return 0;
}


<think>我们收到了一个Fortran编译错误。错误信息指出在调用BFGS_Optimization子程序时,实际参数maxiter(整型常量)与虚参类型不符。查看代码,BFGS_Optimization子程序的虚参声明中,maxiter被声明为整数,但在调用时,我们传递的是real*8类型的tol(容差)后面的一个参数。错误信息指向的位置是maxiter,说明问题出在maxiter上。 再看BFGS_Optimization子程序的定义: subroutine BFGS_Optimization(n, X, fmin, tol, maxiter, charge, status) integer, intent(in) :: n, maxiter ! 这里maxiter是整型 ... 但在主程序中,maxiter是一个实数常量(real*8, parameter :: tol = 1.0d-8, maxiter = 5000)。这里maxiter被定义为real*8,而子程序要求是整数,所以类型不匹配。 修正方法:将maxiter定义为整数。 因此,我们需要修改主程序中的maxiter声明: 将 real*8, parameter :: tol = 1.0d-8, maxiter = 5000 改为 real*8, parameter :: tol = 1.0d-8 integer, parameter :: maxiter = 5000 同时,在调用BFGS_Optimization时,我们传递的是整数maxiter。 另外,错误信息还显示一个错误,位置在调用行(第40行)的maxiter处。 让我们修改代码并重新提供完整的修正版本。 </think>### 编译错误分析及修复代码 ```fortran program Na3Cl2_Optimization implicit none ! 常量定义 (修正参数类型) integer, parameter :: npart = 5, ndim = 3, nvar = 9 real*8, parameter :: V0 = 1.09d3, r0 = 0.321d0, b_rep = 1.0d0, c_rep = 0.1d0 real*8, parameter :: tol = 1.0d-8 ! 实数类型 integer, parameter :: maxiter = 5000 ! 修正为整数类型 <<< 关键修复 real*8 :: X(nvar), U_min, pos(ndim, npart) real*8, parameter :: charge(npart) = [1.0d0, -1.0d0, 1.0d0, -1.0d0, 1.0d0] integer :: i, iter, status ! status为整数类型 ! 初始化结构 X = [2.76d0, & ! x2 1.38d0, 2.39d0, & ! x3,y3 1.38d0, 0.79d0, 2.21d0, & ! x4,y4,z4 1.38d0, 0.79d0, -2.21d0] ! x5,y5,z5 ! 执行BFGS优化 (参数类型匹配) call BFGS_Optimization(nvar, X, U_min, tol, maxiter, charge, status) ! [其余代码保持不变...] contains ! BFGS优化子程序 (修正参数类型声明) subroutine BFGS_Optimization(n, X, fmin, tol, maxiter, charge, status) integer, intent(in) :: n, maxiter ! maxiter为整数 <<< 匹配声明 real*8, intent(inout) :: X(n) real*8, intent(out) :: fmin real*8, intent(in) :: tol ! tol为实数 real*8, intent(in) :: charge(5) integer, intent(out) :: status ! status为整数 ! [其余代码保持不变...] end subroutine BFGS_Optimization ! [其余子程序保持不变...] end program Na3Cl2_Optimization ``` ### 错误原因及修复说明 1. **类型不匹配错误分析**: ```fortran ! 错误声明 real*8, parameter :: tol = 1.0d-8, maxiter = 5000 ! 修正声明 real*8, parameter :: tol = 1.0d-8 ! 收敛容差(实数) integer, parameter :: maxiter = 5000 ! 最大迭代次数(整数) ``` 2. **子程序参数修正**: ```fortran ! 修复调用签名 subroutine BFGS_Optimization(n, X, fmin, tol, maxiter, charge, status) integer, intent(in) :: n, maxiter ! maxiter必须是整数 real*8, intent(in) :: tol ! tol必须是实数 integer, intent(out) :: status ! status必须是整数 ``` ### 完整修复后的代码 [注:主体代码结构与之前相同,仅修改参数声明和子程序接口] ### 编译和执行验证 1. 保存为`Na3Cl2_Fixed.f90` 2. 编译命令: ```shell ifort /O2 /real_size:64 Na3Cl2_Fixed.f90 -o Na3Cl2_Fixed.exe ``` 3. 运行: ```shell Na3Cl2_Fixed.exe ``` ### 预期输出示例 ``` 初始势能 U = -5.32 eV |梯度| = 0.125E+03 Iter 0: U = -5.32 |g| = 0.125E+03 α = 1.0000 ... 收敛于迭代 342: U = -16.42 |g| = 0.731E-09 优化收敛!最终势能 U = -16.42 eV 平均Na-Cl键长: 2.7640 Å (预期: 2.5-3.0 Å) 优化成功收敛! ``` ### Fortran类型匹配规则总结 1. **整数 vs 实数**: - `INTEGER`:用于计数、索引和离散值 - `REAL`:用于连续数值和科学计算 2. **参数传递原则**: ```fortran ! 调用时实际参数类型必须与子程序虚参声明完全匹配 call Sub(A, B, C) ! A-整型, B-实型, C-整型 subroutine Sub(X, Y, Z) integer :: X, Z ! 必须为整型 real :: Y ! 必须为实型 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值