A - A+B?
签到题,输入一个字符串,直接输出a[0]+a[2]即可,代码如下
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define PII pair<int,int>
void solve(){
string str;
cin>>str;
int ans=str[0]+str[2]-96;
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
B - Matrix Rotation
模拟题,最多交换4次即可得到重复,所以模拟4次即可。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define PII pair<int,int>
void solve(){
int a,b,c,d;
cin>>a>>b>>c>>d;
for(int i=1;i<=4;i++)
{
int t=c;
c=d;
d=b;
b=a;
a=t;
if(a>b||c>d||a>c||b>d){
continue;
}else {
cout<<"YES"<<endl;
return ;
}
}
cout<<"NO"<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
C - Different Differences
贪心算法,要求在n个数里面选取k个数,组成单调递增序列,同时要求两个相邻元素直接的差种类最多。那么这个时候K个数我们想要满足条件二,就只能考虑按照差值为1,2,3排列来选取, 那么也就是1,2,4……,当第i项的值到n的个数不满足n-i是那么,从第i项(包括第i项)开始我们依次递增1选取。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define PII pair<int,int>
void solve(){
int n,k;
cin>>n>>k;
map<int,int>mp;
vector<int> ans;
int st=1; //当前取到那一个数
int cnt=0;
for(int i=0;st<=k;i++)
{
st+=i;
ans.push_back(st);
cnt++;
//后面个数全部填充也不够了
if(k-st<n-cnt){
st-=i;
ans[cnt-1]=ans[cnt-2]+1;
st=ans[cnt-1];
break;
}
//个数已经足够。
if(cnt>=n){
break;
}
}
for(int i=st+1;cnt<n;i++)
{
ans.push_back(i);
cnt++;
}
for(auto d:ans) cout<<d<<" ";
cout<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
D - Absolute Sorting
绝对值排序,给定一个数组a,然后我们需要计算出一个数x,使得对于每一个数减去x的绝对值小于后一个数减去x的绝对值。这个时候我们就需要贪心一下考虑x的取值。
对于两个数 a,b;那么我们会有一个 ,那么这个时候,我们可以得到如果
那么x的取值必须
,相反的是
,那么这个时候我们就可以用l,r限制x的取值范围。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define PII pair<int,int>
void solve(){
int n;
cin>>n;
vector<ll> v(n);
for(int i=0;i<n;i++) cin>>v[i];
ll l=0,r=0x3f3f3f3f;
for(int i=0;i<n-1;i++)
{
if(v[i]<v[i+1]){
r=min(r,(v[i]+v[i+1])/2);
}
if(v[i]>v[i+1]){
//这里的+1很细节,举例2,1如果选取1的话,相减取绝对值变成1,0依旧不成立,需要选
//取x=2;
l=max(l,(v[i]+v[i+1]+1)/2);
}
}
if(l<=r) cout<<l<<endl;
else cout<<-1<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
E - Permutation Game
博弈论,两人轮流涂色,然后涂色后的位置可任意排序。也就是说谁先将自己需要涂的位置涂完,谁就可以获得胜利。出现平局的原因:剩下一个数两人都需要涂色。那么谁将这块颜色涂完对方就会获得胜利。所以我们可以得到t1,t2,t3,分别代表第一个人需要涂色的,第二个人需要涂色的,两人共同涂色的部分。那么当时第一个人胜利,当
时第二个人胜利,其他情况是平局。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define PII pair<int,int>
void solve(){
int n;
cin>>n;
vector<int> v(n+1);
for(int i=1;i<=n;i++) cin>>v[i];
int t1=0,t2=0,t3=0;
for(int i=1;i<=n;i++)
{
if(v[i]!=i) t1++;
if(v[i]!=n-i+1) t2++;
if(v[i]!=i&&v[i]!=n-i+1) t3++;
}
if(t1-t3>t2) cout<<"Second"<<endl;
else if(t2-t3>=t1) cout<<"First"<<endl;
else cout<<"Tie"<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}