南理22机试模拟

题库:洛谷

模拟一

A P1307 [NOIP2011 普及组] 数字反转

  • 80
#include<bits/stdc++.h>
using namespace std;
	
int main(){
	string s ;
	getline(cin,s);
	int l = 0 , r = s.size() - 1 ;
	if(s[0] == '0' && l == r) {
		cout << s ; return 0 ;
	}
	if(s[0] == '-') l = 1 ;
	if(s[r] == '0') {
		s.erase(r) ;
		//s.pop_buck() ; my dev is old 
		r -- ;	
	}
	
	while(l < r){
		swap(s[l],s[r]) ;
		l ++ ; r -- ;
	}
	
	cout << s ;
	
	return 0 ;
}


WA:00100,尾部所有的 0 都要删掉。

  • 100
#include<bits/stdc++.h>
using namespace std;
	
int main(){
	string s ;
	getline(cin,s);
	int l = 0 , r = s.size() - 1 ;
	if(s[0] == '-') l = 1 ;
	for( ; r > l ; r --){
		if(s[r] == '0') s.erase(r) ;
		else break ;
	}
	
	while(l < r){
		swap(s[l],s[r]) ;
		l ++ ; r -- ;
	}
	
	cout << s ;
	
	return 0 ;
}


B P1003 [NOIP2011 提高组] 铺地毯

#include<bits/stdc++.h>
using namespace std;
	
int main(){
	int n ; cin >> n ;
	int a[n] , b[n] , g[n] , k[n] ;
	for(int i = 0 ; i < n ; i ++){
		cin >> a[i] >> b[i] >> g[i] >> k[i] ;
		g[i] += a[i] ; k[i] += b[i] ;
	}
	int m , p ; cin >> m >> p ;
	
	int cnt = 0 ;
	
	for(int i = 0 ; i < n ; i ++){
		if(m >= a[i] && m <= g[i] && p >= b[i] && p <= k[i]) cnt = i + 1 ;
	}
	
	if(cnt == 0) cnt = -1 ;
	cout << cnt << endl ;
	return 0 ;
}

C P1144 最短路计数

模拟四

A P1428 小鱼比可爱

  • 贪心
#include<bits/stdc++.h>
using namespace std;

int n ;
int a[105] ;
int ans[105] ;

int main(){
	cin >> n ;
	for(int i = 0 ; i < n ; i ++){
		cin >> a[i] ;
	}
	
	for(int i = 0 ; i < n ; i ++){
		int tmp = a[i] ;
		sort(a , a + i + 1) ;
		for(int j = 0 ; j <= i ; j ++){
			if(a[j] == tmp) {
				ans[i] = j ;
				break ;
			}
		}
	}
	
	for(int i = 0 ; i < n ; i ++){
		cout << ans[i] << " ";
	}
	
	return 0;
}

如果数据量更大,考虑将sort改为每次插入数据。

B P2356 弹珠游戏

  • 压缩
#include<bits/stdc++.h>
using namespace std;

int n , s ;
int row[1010] = {0} , col[1010] = {0} ;
int erow[10010] , ecol[10010] ;

int main(){
	cin >> n ;
//	memset(row , 0 , n) ;
//	memset(col , 0 , n) ;
	int epre = 0 ;
	for(int i = 0 ; i < n ; i ++){
		for(int j = 0 ; j < n ; j ++){
			cin >> s;
			if(s != 0){
				row[i] += s ;
				col[j] += s ;
			}
			if(s == 0){
				erow[epre] = i ;
				ecol[epre] = j ;
				epre ++ ;
			}
		}
	}
	
	int ans = -1 ;
	for(int i = 0 ; i < epre ; i ++){
		ans = max (ans , row[erow[i]] + col[ecol[i]]) ;
	}
	
	if(ans == -1) cout << "Bad Game!" << endl ;
	else cout << ans << endl ;
	
	return 0;
}

C P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

  • 90
#include<bits/stdc++.h>
using namespace std;

int x , y ;
int ans = 0 ;

bool is(int x , int y){
	for(int i = 2 ; i <= x ; i ++){
		if(x % i == 0 && y % i == 0) return false ; // no huzhi
	}
	return true ;
}

int main(){
	cin >> x >> y ;
	y = y / x ;
	
	for(int i = 1 ; i <= y ; i ++){
		if(y % i == 0){
			int tmp = y / i ;
			if(i < tmp){
				if(is(i , tmp)) ans ++ ;
			}
			else{
				if(is(tmp, i)) ans ++ ;
			}
		}
	}
		
	cout << ans ;
	
	return 0;
}

错误用例 12 4096 错误输出 4 正确输出 0

  • AC
#include<bits/stdc++.h>
using namespace std;

int x , y ;
int ans = 0 ;

bool is(int x , int y){
	for(int i = 2 ; i <= x ; i ++){
		if(x % i == 0 && y % i == 0) return false ; // 不 互质 
	}
	return true ;
}

int main(){
	cin >> x >> y ;
	
	int m ;
	// 首先要判断  x , y 是否最大公约数是 x 。 
	for(int i = 2 ; i <= x ; i ++){
		if(x % i == 0 && y % i == 0){
			m = i ;
		}
	} 
	if(m != x){
		cout << 0 << endl ;
		return 0 ;
	}
	
	y = y / x ;
	
	for(int i = 1 ; i <= y ; i ++){
		if(y % i == 0){
			int tmp = y / i ;
			if(i < tmp){
				if(is(i , tmp)) ans ++ ;
			}
			else{
				if(is(tmp, i)) ans ++ ;
			}
		}
	}
		
	cout << ans ;
	
	return 0;
}

对于 x , y , 要先判断二者的最大公约数是不是 x 。

D P1515 旅行

  • 去重后二分
#include<bits/stdc++.h>
using namespace std;

int a, b, n ;
vector<int> s = {0, 990, 1010, 1970, 2030, 2940, 3060, 3930, 4060, 4970, 5030, 5990, 6010, 7000} ;
int aa[40] = {0} ;

int findl(int x, int i){
	int l = 0 , r = i ;
	while(l < r){
		int mid = (l + r) >> 1 ;
		if(s[mid] >= x) r = mid ;
		else l = mid + 1 ;
	}
	return l ;
}

int findr(int x, int i){
	int l = 0 , r = i ;
	while(l < r){
		int mid = (l + r + 1) >> 1 ;
		if(s[mid] <= x) l = mid ;
		else r = mid - 1 ;
	}
	return l ;
}

int main(){
	
	cin >> a >> b >> n ;
	for(int i = 0 ; i < n ; i ++){
		int tmp ; cin >> tmp ;
		s.emplace_back(tmp) ;
	}
    
    int sn = s.size() ;
	aa[0] = 1 ;
    sort(s.begin(),s.end()) ;
    s.erase(unique(s.begin(), s.end()), s.end());
	
	for(int i = 1 ; i < sn ; i ++){
		int l = s[i] - b , r = s[i] - a ;
		int lindex = findl(l,i) ;
		int rindex = findr(r,i) ;
		for(int j = lindex ; j <= rindex ; j ++){
			aa[i] += aa[j] ;
		}
	}
	
	cout << aa[sn - 1] << endl ;
	
	return 0;
}

E P1462 通往奥格瑞玛的道路

F P1352 没有上司的舞会

模拟五

B

  • 90
#include<bits/stdc++.h>
using namespace std ;

int n ;
int x[55] , y[55] , r[55] ;
int x1 , x2 , yy , y2 ;

int dis(int x, int y, int xx, int yy, int r){
	float dis = (yy - y) * (yy - y) + (xx - x) * (xx - x) ;
	if(dis < r * r) return 1 ;
	else return 0 ;
}

int main(){
	cin >> n ;
	for(int i = 0 ; i < n ; i ++){
		cin >> x[i] ;
	}
	for(int i = 0 ; i < n ; i ++){
		cin >> y[i] ;
	}
	for(int i = 0 ; i < n ; i ++){
		cin >> r[i] ;
	}
	cin >> x1 >> yy >> x2 >> y2 ;
	
	int cnt = 0 ;
	
	for(int i = 0 ; i < n ; i ++){
		cnt += dis(x1, yy, x[i], y[i], r[i]) ;
		cnt += dis(x2, y2, x[i], y[i], r[i]) ;
	}
	
	cout << cnt << endl ;
	
	return 0 ;
}

4
0 0 0 0
0 7 6 -6
10 1 3 2
0 7 0 -6
WA : 5   RA : 3
  • AC
#include<bits/stdc++.h>
using namespace std ;

int n ;
int x[55] , y[55] , r[55] ;
int x1 , x2 , yy , y2 ;

int dis
(int x, int y, int xx, int yy, int r){
	float dis = (yy - y) * (yy - y) + (xx - x) * (xx - x) ;
	if(dis < r * r) return 1 ;
	else return 0 ;
}

int main(){
	cin >> n ;
	for(int i = 0 ; i < n ; i ++){
		cin >> x[i] ;
	}
	for(int i = 0 ; i < n ; i ++){
		cin >> y[i] ;
	}
	for(int i = 0 ; i < n ; i ++){
		cin >> r[i] ;
	}
	cin >> x1 >> yy >> x2 >> y2 ;
	
	int cnt = 0 ;
	
	for(int i = 0 ; i < n ; i ++){
		int a = dis(x1, yy, x[i], y[i], r[i]) ;
		int b = dis(x2, y2, x[i], y[i], r[i]) ;
		int tmp = a + b ;
		if(a + b == 1) cnt ++ ;
	}
	
	cout << cnt << endl ;
	
	return 0 ;
}

C

  • 60
#include<bits/stdc++.h>
using namespace std ;

int n ;
int s[11] , b[11] ;
bool is[11] = {0} ;
int ans = INT_MAX ;

void dfs(int x, int ss, int bb){
	if(x == n) return ;
	
	for(int i = x + 1 ; i <= n ; i ++){
		ss *= s[i] ;
		bb += b[i] ;
		ans = min(ans , abs(ss - bb)) ;
		dfs(i, ss, bb) ;
	}
}

int main(){
	cin >> n ;
	int ss = 1 , bb = 0 ;
	for(int i = 1 ; i <= n ; i ++){
		scanf("%d%d",&s[i],&b[i]) ;
	}
	
	for(int i = 1 ; i <= n ; i ++){
		int ss = s[i] ;
		int bb = b[i] ;
		ans = min(ans , abs(ss - bb)) ;
		dfs(i, ss, bb) ;
	}
	
	printf("%d",ans) ;
	
	return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值