本文主要是介绍Codeforces Round 925 (Div. 3) A-F,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链接:Dashboard - Codeforces Round 925 (Div. 3) - Codeforces
A. Recovering a Small String
题意:a到z表示1-26,给出一个数字,要求用三位字母组成的字符串表示,同时这三位字母加起来等于这个数字,使得字符串字典序最小。
思路:后面的字符越大越好
代码:
#include <bits/stdc++.h>
#define ll long long
//#define endl '\n'
using namespace std;
const int N=1e5+7;void solve(){int n;cin>>n;if(n<=28){cout<<"aa"<<(char)(n-2-1+'a')<<endl;return;}else if(n<=53){cout<<"a"<<(char)(n-27-1+'a')<<"z"<<endl;return;}else{cout<<(char)(n-52-1+'a')<<"zz"<<endl;return;}
} int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve(); }return 0;
}
B. Make Equal
题意:给出n个数字,前面的数字可以匀给后面的,请问是否可以让所有数字一样。
思路:从前往后累积,只要能超过总和的平均就是合理的
代码:
#include <bits/stdc++.h>
#define ll long long
//#define endl '\n'
using namespace std;
const int N=1e5+7;void solve(){int n;cin>>n;vector<ll> a(n+2);ll sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}sum/=n;int x=0;for(int i=1;i<=n;i++){x+=a[i];if(x<sum*i){cout<<"NO"<<endl;return;}}cout<<"YES"<<endl;
} int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve(); }return 0;
}
C. Make Equal Again
题意:对于长度为n的数组,选定一个区间将其中全部数字修改为指定的值,然后使得整个数组数字相等,求这个区间的最短长度。
思路:首先前后连续区间是对答案是有贡献的,当前后俩段相等区间的值相等时候,共同有贡献,否则就选长的一段,答案就是总长减去较长者
代码:
#include <bits/stdc++.h>
#define ll long long
//#define endl '\n'
using namespace std;
const int N=1e5+7;void solve(){int n;cin>>n;vector<int> a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}int l=1;while(l<=n&&a[l]==a[1]){l++;}int r=n;while(r>=1&&a[r]==a[n]){r--;}int ans=n;//cout<<l<<" "<<n-r<<endl;if(a[1]==a[n]){ans-=l-1;ans-=n-r;}else{ans-=max(l-1,n-r);}cout<<max(0,ans)<<endl;
} int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve(); }return 0;
}
D. Divisible Pairs
题意:给定x和y,对于长度为n的数组a,其中有ai+aj可以整除x并且ai-aj可以整除y为一对,统计有多少对这样的数字。
思路:有ai+aj=x,ai-aj=y,可以得到ai%x+aj%x=x%x && ai%y=aj%y -> aj%x=(x-ai%x)%x ai%y=aj%y 所以对于i<j,在到达j的时候我们应该已经统计好对应的x-ai%x ai%y的值了,用map存一下就行。
代码:
#include <bits/stdc++.h>
#define ll long long
//#define endl '\n'
using namespace std;
const int N=1e5+7;void solve(){int n,x,y;cin>>n>>x>>y;vector<int> a(n);for(int i=0;i<n;i++) cin>>a[i];ll ans=0;map<pair<int,int>,int> q;for(int i=0;i<n;i++){ans+=q[make_pair((x-a[i]%x)%x,a[i]%y)];q[make_pair(a[i]%x,a[i]%y)]++;}cout<<ans<<endl;
} int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve(); }return 0;
}
E. Anna and the Valentine's Day Gift
题意:给出一个包含n个数字的数组a,Anna先操作,可以翻转一个数字(翻转后去除前导零),Sasha后操作,可以拼接用任意顺序俩个不同的数字再放回原来的数字,问最后数字的大小是否超过10^m。
思路:10^m其实只要看最后的数字位数有没有m位就可以了,对于俩人的操作,Anna是尽可能的将后面0多的翻转就可以消掉更多位数,Sasha拼接的时候让后面0多的拼到中间就不会被减少位数了。所以对于数组的排序就是看数字后面的零的数量来排序。
代码:
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=5e5+7;
int n,m;void solve(){cin>>n>>m;vector<string> q;for(int i=0;i<n;i++){string s;cin>>s;q.push_back(s);}vector<int> num(n);for(int i=0;i<n;i++){int cnt=0;string temp=q[i];for(auto it=temp.rbegin();it!=temp.rend()&&*it=='0';it++){num[i]++;}}ll all=0;for(int i=0;i<n;i++){all+=q[i].size()-num[i];}sort(num.begin(),num.end());reverse(num.begin(),num.end());for(int i=0;i<n;i++){if(i&1) all+=num[i];}if(all-1>=m){cout<<"Sasha"<<endl;}else cout<<"Anna"<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}
F. Chat Screenshots
题意:总共有n个人,其中k个人看到了排序,第i个人看到自己的位置肯定是第一的,问综合大家看到的排序是否可能存在。
思路:对于每一个看到的,第一个位置是不可信的,其他位置可以信任,那么由此可以建立一个图,从2->3的位置建图类推,注意重复的边不加入,然后拓扑排序跑一遍看是否能为n的点就知道是不是合理的了。
代码:
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=2e5+7;
int n,k;
vector<int> q[N];
int in[N];
void solve(){cin>>n>>k;memset(in,0,sizeof(in));for(int i=0;i<=n;i++) q[i].clear();map<pair<int,int>,int> mp;for(int j=1;j<=k;j++){vector<int> a(n);for(int i=0;i<n;i++){cin>>a[i];}for(int i=2;i<n;i++){if(mp.find(make_pair(a[i-1],a[i]))==mp.end()){mp[make_pair(a[i-1],a[i])]++;q[a[i-1]].push_back(a[i]);in[a[i]]++;}}}//cout<<mp.size()<<endl;queue<int> line;int cnt=0;for(int i=1;i<=n;i++){if(in[i]==0){line.push(i);cnt++;}}while(!line.empty()){auto temp=line.front();line.pop();for(auto it:q[temp]){if(--in[it]==0){line.push(it);cnt++;}}}cout<<(cnt==n?"YES":"NO")<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}
这篇关于Codeforces Round 925 (Div. 3) A-F的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!