A.
贪心
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int a[N];
void lan(){
int n;
cin>>n;
string s="";
n-=2;
s+="aa";
if(n>=26){
s+='z';
n-=26;
}else{
s+=('a'+n-1);
cout<<s<<'\n';
return;
}
for(int i=s.size()-2;i>=0 && n;i--){
if(s[i]+n>='z'){
n-=(26-(s[i]-'a'+1));
s[i]='z';
}else{
s[i]+=(n);
n=0;
}
}
cout<<s<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
B.
模拟
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
ll a[N];
void lan(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll ans=0;
for(int i=1;i<=n;i++){
ans+=a[i];
}
ll x=ans/n;
for(int i=1;i<=n-1;i++){
if(a[i]>x){
a[i+1]+=(a[i]-x);
a[i]=x;
}
}
for(int i=1;i<=n;i++){
if(a[i]!=x){
cout<<"NO"<<'\n';
return;
}
}
cout<<"YES"<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
C.
双指针?
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int a[N];
inline void lan(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ll l=1,r=n;
if(a[1]==a[n]){//夹中间
while(a[l]==a[1]){
l++;
}
while(a[r]==a[n]){
r--;
}
cout<<max(0ll,r-l+1)<<'\n';
}else{//1.右边,2.左边
while(a[l]==a[1]){
l++;
}
while(a[r]==a[n]){
r--;
}
cout<<max(0ll,min(n-l+1,r))<<'\n';
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
D.
同余
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int a[N];
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void lan(){
int n,x,y;
cin>>n>>x>>y;
map<pair<int,int>,int> mp;
ll ans=0;
for(int i=1;i<=n;i++){
int t;
cin>>t;
ans+=mp[make_pair((x-t%x)%x,t%y)];//满足找到t,和t的对立面(x-t%x)%x;
mp[make_pair(t%x,t%y)]++;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
E.
博弈,操作1可以把后导零减少,操作二保护后导零
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
ll a[N];
ll ws(ll x){//计算数位
ll res=0;
while(x){
res++;
x/=10;
}
return res;
}
ll hdl(string x){//计算后导零
ll res=0;
int pos=x.size()-1;
while(x[pos]=='0'){
res++;
pos--;
}
return res;
}
void lan(){
int n,m;
cin>>n>>m;
ll sum=0;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
sum+=ws(x);
// cout<<ws(x)<<'\n';
a[i]=hdl(to_string(x));
}
sort(a+1,a+1+n,greater<int>());//排序两个人贪心选
ll ans=0;
for(int i=1;i<=n;i+=2){
ans+=a[i];
}
// cout<<sum<<" "<<ans<<'\n';
if(sum-ans>=m+1){
cout<<"Sasha"<<'\n';
}else{
cout<<"Anna"<<'\n';
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
F.
拓扑排序判断不是一个环
#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int ind[N],outd[N];//入度,出度
int a[N];
vector<int> edge[N];
int n;
bool tuopo(){//拓扑排序不是环就true
queue<int> q;
int ans=0;
for(int i=1;i<=n;i++){
if(!ind[i]){//没有入度就入队
q.push(i);
ans++;
}
}
while(!q.empty()){
int x=q.front();
for(auto &i:edge[x]){
ind[i]--;
if(!ind[i]){
q.push(i);
ans++;
}
}
q.pop();
}
return ans==n;
}
inline void lan(){
int k;
cin>>n>>k;
for(int i=1;i<=n;i++){//初始化
edge[i].clear();
ind[i]=0;
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
cin>>a[j];
if(j>2){
edge[a[j-1]].push_back(a[j]);//建单项边->
ind[a[j]]++;
}
}
}
if(tuopo()){
cout<<"YES"<<'\n';
}else{
cout<<"NO"<<'\n';
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int q;
cin>>q;
while(q--){
lan();
}
return 0;
}
1457

被折叠的 条评论
为什么被折叠?



