注解见代码注释
A:
/*
直接初始化也可以
vector<string> ans(100, "zzz");
for(int i = 0; i < 26; i++){
for(int j = 0; j < 26; j++){
for(int k = 0; k < 26; k++){
string t;
t += char('a' + i);
t += char('a' + j);
t += char('a' + k);
ans[(i + j + k) + 3] = min(ans[(i + j + k) + 3], t);
}
}
}
*/
void solve()
{
int n;
cin>>n;
vector<int> a;
while(a.size()<3){
if(n>=26+(3-a.size())){
a.push_back(26);
n-=26;
}
else{
a.push_back(n-(3-a.size()-1));
n=3-a.size();
}
}
for(int i=2;i>=0;i--){
cout<<char(a[i]-1+'a');
}
cout<<endl;
}
B.
void solve()
{
/*
计算每个数能为后面的数提供多少贡献,如果某个数满足不了就输出NO
*/
int n;
cin>>n;
vector<ll> a(n);
ll sum=0;
ll k=0;
ll av;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
av=sum/n;
for(int i=0;i<n;i++){
k+=(a[i]-av);
if(k<0){
cout<<"NO"<<endl;
return;
}
}
cout<<"YES"<<endl;
}
C.
void solve()
{
/*
注意只能执行一次操作,赛时开始没注意到!!服了
*/
int n;
cin>>n;
vector<int> a(n);
for(int i=0;i<n;i++){
cin>>a[i];
}
int ans=1;
int l=a[0],r=a[n-1];
int la=0,ra=n-1;
int ln=0,rn=0;
while(a[la]==l && la<n){
la++;
}
while(a[ra]==r && ra>=0){
ra--;
rn++;
}
if(la==n||ra==n){
cout<<0<<endl;
return;
}
if(l==r){
cout<<n-(la+rn)<<endl;
}
else{
cout<<n-max(la,rn)<<endl;
}
}
D.
void solve()
{
int n;
ll x,y;
cin>>n>>x>>y;
ll a;
ll ans=0;
map<pair<int,int>,int> mp;
for(int i=0;i<n;i++){
cin>>a;
int r1=a%x,r2=a%y;
/*
a+b=k1*x;----(a+b)%x==0-----a%x==(x-(b%x))%x
a-b=k2*y;----(a-b)%y==0-----a%y==b%y
*/
if(mp[{(x-r1)%x,r2}]){
ans+=mp[{(x-r1)%x,r2}];
}
mp[{r1,r2}]++;
}
cout<<ans<<endl;
}
E.
void solve()
{
/*
Anna每次只能合并两个数,Sasha翻转某个数
结束时剩下的那个数游戏结束。如果这个整数不小于10^m(即 ≥10m),萨沙获胜。否则,安娜获胜。-----比较最后那个数的位数和m+1即可
所以萨沙为了赢会尽可能保留那些以0结尾的数字,而安娜会尽可能去通过翻转尾0的数字(反转后0消失)去减少最后剩下的数的位数
*/
int n,m;
cin>>n>>m;
int sum=0;
string s;
vector<int> p;
for(int i=0;i<n;i++){
cin >> s;
int cnt0 = 0;
while(s.back() == '0'){
cnt0 += 1;
s.pop_back();
}
p.push_back(cnt0);
int len = s.size();
sum += len;
}
sort(p.begin(), p.end(), greater<>());
for(int i = 1; i < p.size(); i += 2){
sum += p[i];//安娜先手,则从第二次操作开始的0会被萨沙保留
}
if(sum>=m+1){
cout<<"Sasha"<<endl;
}
else{
cout<<"Anna"<<endl;
}
}
F.
void solve()
{
//根据优先关系建图,使用拓扑排序判断是否有环,有环就代表优先关系不唯一
int n,k;
cin>>n>>k;
vector<int> in(n+1,0);//入度
vector<vector<int>> g(n+1);//图
for(int i=1;i<=k;i++){
vector<int> temp(n);
for(int j=0;j<n;j++){
cin>>temp[j];
}
for(int j=1;j<n-1;j++){
//从第二个人开始就是优先级
g[temp[j]].push_back(temp[j+1]);
in[temp[j+1]]++;
}
}
//卡恩算法
//所有入度为0的点
queue<int> q;
vector<int> p;
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
}
}
while(q.size()){
int t=q.front();
q.pop();
p.push_back(t);
for(auto x:g[t]){
if(--in[x]==0){
q.push(x);
}
}
}
if(p.size()==n){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}