题库:洛谷
模拟一
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 ;
}