文章目录
- A My First Sorting Problem(模拟)
- B Different String(模拟、字符串)
- C Clock and Strings(模拟)
- D Binary Cut (贪心)
- E Find the Car(二分查找、数学)
- F Circle Perimeter(几何、数学、暴力)
A My First Sorting Problem(模拟)
标程:
#include <bits/stdc++.h>
using namespace std;int main() {int T; cin >> T;while (T--) {int x,y;cin >> x >> y;if(x > y) cout << y <<" " << x <<"\n";else cout << x <<" " << y <<"\n";}return 0;
}
B Different String(模拟、字符串)
题意:判断字符串 s s s改变顺序后,能否变得不一样。
思路: 全部一样肯定是NO
,如果换一下,随便找两个不一样的换即可。
标程:
#include <bits/stdc++.h>
using namespace std;int main() {int T; cin >> T;while (T--) {string s;cin >> s;if(s.size() == 1 ) cout << "NO\n";else {bool flag = 0;for(int i = 0; i < s.size(); i++){if(s[0] != s[i]){flag = 1;swap(s[0], s[i]);}}if(flag == 0) cout << "NO\n";else{cout << "YES\n";cout << s << '\n';}}}return 0;
}
C Clock and Strings(模拟)
题意:判断两条线是否在同一区域。
思路: 判断c,d两点是否在a,b点连成的线一侧。
标程1:
#include <bits/stdc++.h>
using namespace std;int main() {int T; cin >> T;while (T--) {int a, b, c, d;cin >> a >> b >> c >> d;if(a>b)swap(a,b);if(c>d)swap(c,d);bool flag1=0,flag2=0;if(c > a && c < b) flag1 = 1;if(d > a && d < b) flag2 = 1;if(flag1 == flag2) cout << "NO\n";else cout << "YES\n";}return 0;
}
D Binary Cut (贪心)
题意:给定 01 01 01组成的字符串,希望切若干段,使得最后拼成有序字符串,问最少需要切成多少段。
思路: 这道题思考不足,WA了好多次。捋一下思路,10时候才需要切断,但是如果是01001
,得到01
,001
,但只能得到一些有序的子段,并不能合成00011
,其实最多只能有1个01
子串,因此计算01
串,并把他们再切开。
也可以是:直接看有几段·0
和 1
即可,注意到最后一段 0
可以连着 1
,所以特判一下。
标程:
#include <bits/stdc++.h>
using namespace std;int main() {int T; cin >> T;while (T--) {string s;cin >> s;int cnt1 = 0, cnt2 = 0;for(int i = 0; i+1 < s.size(); i++){if(s[i] == '1' && s[i+1] == '0')cnt1++; if(s[i] == '0' && s[i+1] == '1')cnt2++;}cout << 1+cnt1 + (cnt2>1?cnt2-1:0) << '\n';
// cout << cnt1 <<","<<cnt2<< '\n';}return 0;
}
E Find the Car(二分查找、数学)
题意:给定每一站到达的时间,和里程,若给定位置 d d d,请计算等待的时长。
思路: 二分找一下该位置下的前后两点,根据 位置-左端点位置/左右端点距离差 = 时间-左端点时间/左右端点时间差,求出等待时间
标程1:
#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int T; cin >> T;while (T--) {int n,k,q,a[100005]={},b[100005]={};cin>> n >>k >> q;for(int i = 1; i <= k; i++) cin>> a[i]; for(int i = 1; i <= k; i++) cin>> b[i];while(q--){int d;cin>>d;int rt = lower_bound(a+1,a+k+1,d) - a;int lf = rt - 1;
// cout << lf <<"," <<rt<<","<<"d:"<<d<<","<<double(d-a[lf])<<"--\n";double ans = b[lf]+(double(d-a[lf]))*(b[rt]-b[lf])/(a[rt]-a[lf]);cout << (int)floor(ans)<<" ";}cout << '\n';}return 0;
}
F Circle Perimeter(几何、数学、暴力)
题意:给定数字 r r r,请问满足距离 ( 0 , 0 ) (0,0) (0,0)点的欧几里得距离 r ≤ d < r + 1 r\leq d<r+1 r≤d<r+1的点的数量。
思路: 四个象限,枚举一个其他乘以4即可。因此只看第一想想,我们枚举横坐标x,找出在半径为r+1,半径为r上对应的纵坐标y1,y2,求两者之间的点的数量即可。注意 d < r + 1 d<r+1 d<r+1,所以等于的情况要特判一下。
标程1:
#include <bits/stdc++.h>
using namespace std;int main() {int T; cin >> T;while (T--) {long long r; cin >> r;long long cnt = 0;for(long long x = 1; x <= r; x++){//枚举x坐标 long long y1 = floor(sqrt((r+1)*(r+1)-x*x));if(y1*y1 ==(r+1)*(r+1) - x*x) y1--;long long y2 = ceil(sqrt(r*r-x*x)); cnt += y1-y2+1; }cout << cnt*4<<'\n';}return 0;
}