A
# include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
cin>>a>>b;
if(a<=b)
swap(a,b);
cout<<b<<" "<<a<<endl;
}
return 0;
}
B 观察是否有不同的字母即可
# include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
bool st=0;
for(int i=0;i<s.size()-1;i++)
{
if(s[i]!=s[i+1])
{
st=1;
swap(s[i],s[i+1]);
}
}
if(st){
cout<<"YES"<<endl<<s<<endl;
}
else cout<<"NO"<<endl;
}
}
C
按照顺序绕时钟走一圈。如果我们连续经过两条红色字符串或两条蓝色字符串,这些字符串就不会相交;反之,它们就会相交。
#include <bits/stdc++.h>
using namespace std;
const int MAX = 200'007;
const int MOD = 1'000'000'007;
void solve() {
int a, b, c, d;
cin >> a >> b >> c >> d;
string s;
for (int i = 1; i <= 12; i++) {
if (i == a || i == b) {s += "a";}
if (i == c || i == d) {s += "b";}
}
cout << (s == "abab" || s == "baba" ? "YES\n" : "NO\n");
}
int main() {
int tt; cin >> tt; for (int i = 1; i <= tt; i++) {solve();}
return 0;
}
D
发现如果存在01串 可以减少一次拆分 正常模拟即可
# include <bits/stdc++.h>
using namespace std;
int main()
{
int t ;
cin>>t;
while(t--)
{
string s;
cin>>s;
int z=0;
int wei=s[0]-'0';
int n=s.size();
int tag=0;
if(wei==0){
tag=-1;
}
for(int i=1;i<=n-1;i++){
if(wei!=s[i]-'0'){
wei=s[i]-'0';
z++;
}
if(s[i]=='0'){
if(tag==0)tag=-1;
}
if(s[i]=='1'){
if(tag==-1){
tag=1;
}
}
}
if(z==0){
cout<<1<<endl;
}
else cout<<z+1-max(0,tag)<<endl;
}
}
E
用二分找到第一个坐标大于的等于x的点 可使用lowwer bound 分成两段 第一段0-二分查找的位置-1 第二段二分查找位置-1到x
# include <bits/stdc++.h>
using namespace std;
# define int long long
signed main()
{
int T;
cin>>T;
while(T--)
{
int n,k,q;
cin>>n>>k>>q;
vector<int>arr(k);
vector<int>brr(k);
for(int i=0;i<=k-1;i++)
{
cin>>arr[i];
}
for(int i=0;i<=k-1;i++)
{
cin>>brr[i];
}
while(q--)
{
int x;
cin>>x;
int z=lower_bound(arr.begin(),arr.end(),x)-arr.begin();
//lower_bound,找到比当前值大于等于的位置
int ans1=0;
if(z==0)
{
ans1=x*brr[z]/arr[z];
}
else
{
ans1=brr[z-1]+(x-arr[z-1])*(brr[z]-brr[z-1])/(arr[z]-arr[z-1]);
//时间=距离/速度
}
//向下取整
cout<<ans1<<' ';
}
cout<<endl;
}
return 0;
}