文章目录
- 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;
}