| 题目 | 难度 | 知识点 |
|---|---|---|
| A 球?球 | ★ | 签到 |
| B 活动 | ★ | 签到 |
| C 分赃 | ★ | 博弈论 |
| D 三行四列行列式 | ★ | 签到 |
| E KAKAZL的时间魔咒 | ★ | 模拟 |
| F 加训 | ★ | 模拟 |
| G 白日登山望烽火,黄昏饮马傍交河 | ★ | 马喝水最短,数学 |
| H Small Orange的后花园 | ★★ | 前缀和,双重累加化简 |
| I 解码 | ★ | 签到 |
| J 选歌 | ★ | 签到 |
| K 晒卡 | ★ | 签到 |
| L aya的字符串 | ★ | 签到 |
| M 有顶天变~ | ★★ | 贪心 |
球?球
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],t,n,z,s;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>z>>s;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
if(a[i]>s) cnt1=max(cnt1-2,0);
if(a[i]<=s) cnt1++;
if(b[i]>z) cnt2=max(cnt2-2,0);
if(b[i]<=z) cnt2++;
}
if(cnt1>cnt2) puts("zy");
else if(cnt1==cnt2) puts("none");
else puts("sdy");
}
return 0;
}
活动
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
if(n>=50) puts("wy");
else puts("ty");
return 0;
}
分赃
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
string s; cin>>s;
int t=s[s.size()-1]-'0';
if(t&1) puts("clx");
else puts("yxy");
return 0;
}
三行四列行列式
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N],b[N][N],n,x,y;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>a[i][j],b[i][j]=a[i][j];
cin>>x>>y;
for(int i=1;i<=n;i++)
b[x][i]=a[i][y],b[i][y]=a[x][i];
b[x][y]=ceil((a[x][x]+a[y][y])/2.0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cout<<b[i][j]<<" ";
puts("");
}
return 0;
}
KAKAZL的时间魔咒
#include<bits/stdc++.h>
using namespace std;
void solve(int a,int b)
{
int cnt=0;
while(1)
{
string s1=to_string(a);
string s2=to_string(b);
if(s1.size()==1) s1="0"+s1;
if(s2.size()==1) s2="0"+s2;
reverse(s2.begin(),s2.end());
if(s1==s2)
{
reverse(s2.begin(),s2.end());
cout<<s1<<":"<<s2<<'\n';
cout<<cnt<<'\n';
break;
}
b++,cnt++;
if(b==60) a++,b=0;
if(a==24) a=0;
}
}
int main(void)
{
int t; cin>>t;
while(t--)
{
int a,b;
scanf("%d:%d",&a,&b);
solve(a,b);
}
return 0;
}
加训
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int n,m;
string a,b;
cin>>n>>m>>a>>b;
string ans;
for(int i=0;i<n;i++)
{
int j=i;
while(j+1<n&&a[j+1]==a[i]) j++;
i=j;
ans+=a[i];
}
if(ans==b) puts("Yes");
else puts("No");
}
return 0;
}
白日登山望烽火,黄昏饮马傍交河
最短就是对称点到A的距离。
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
double x,y,xx,yy; cin>>x>>y>>xx>>yy;
double dyx,dyy,dxx,dxy;
dyx=-xx,dyy=yy,dxx=xx,dxy=-yy;
double sumy=(x-dyx)*(x-dyx)+(y-dyy)*(y-dyy);
double sumx=(x-dxx)*(x-dxx)+(y-dxy)*(y-dxy);
if(sumx<sumy) puts("x");
else puts("y");
}
return 0;
}
Small Orange的后花园
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int mod=998244353;
typedef long long int LL;
LL f[N],s[N],ss[N],t,n;
void init()
{
f[1]=1,f[2]=1;
for(int i=3;i<=1e5;i++) f[i]=(f[i-1]+f[i-2])%mod;
for(int i=1;i<=1e5;i++)
{
s[i]=(s[i-1]+f[i])%mod;
ss[i]=(ss[i-1]+f[i]*f[i]%mod)%mod;
}
}
void solve(int n)
{
LL sum=0;
for(int i=1;i<=n;i++)
{
LL sum1=(s[n]-s[i-1]+mod)%mod;
LL sum2=(ss[n]-ss[i-1]+mod)%mod;
LL temp1=(n-i+1)*f[i]%mod*f[i]%mod;
LL temp2=-2*f[i]%mod*sum1%mod;
sum=(sum+temp1)%mod;
sum=(sum+temp2+mod)%mod;
sum=(sum+sum2)%mod;
}
cout<<sum<<'\n';
}
int main(void)
{
cin>>t;
init();
while(t--)
{
cin>>n;
solve(n);
}
return 0;
}
解码
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int n,k; cin>>n>>k;
string s; cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]>='a')
{
char op='a'+(s[i]-'a'-k+26)%26;
cout<<op;
}else
{
char op='A'+(s[i]-'A'-k+26)%26;
cout<<op;
}
}
cout<<'\n';
}
return 0;
}
选歌
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],t,n,sum;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>sum;
vector<pair<int,int>>ve;
for(int i=1;i<=n;i++) cin>>a[i],ve.push_back({-a[i],i});
sort(ve.begin(),ve.end());
vector<int>ans;
for(int i=0;i<n;i++)
{
sum+=ve[i].first;
ans.push_back(ve[i].second);
if(sum<=0) break;
}
if(sum<=0)
{
puts("YES");
cout<<ans.size()<<'\n';
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
puts("");
}else puts("NO");
}
return 0;
}
晒卡
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],b[N],n,t;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n;
map<int,int>mp,mp1;
for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
vector<int>ans;
for(int i=0;i<n;i++)
{
cin>>b[i];
if(mp[b[i]]&&!mp1[b[i]]) ans.push_back(b[i]);
mp1[b[i]]++;
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<'\n';
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
if(ans.size()) cout<<'\n';
}
return 0;
}
aya的字符串
正解是字符串hash,但是由于A 中每种字母只出现了一次。故其实暴力枚举不了几次
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int n;
string s;
cin>>n>>s;
int st[26]={0};
int flag=1;
for(int i=0;i<n;i++)
if(s[i]>='a'&&s[i]<='z');
else flag=0;
if(!flag)
{
puts("shameimaru");
continue;
}
flag=0;
for(int i=0;i<s.size();i++)
{
if(st[s[i]-'a']) break;
st[s[i]-'a']++;
int len=s.size()-i-1;
if(len%2==0&&len>=2)
{
string s1=s.substr(i+1,len/2);
string s2=s.substr(i+1+len/2);
if(s1==s2) flag=1;
}
if(flag) break;
}
if(flag) puts("aya");
else puts("shameimaru");
}
return 0;
}
有顶天变~
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],t,n;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n;
int maxv=0;
for(int i=1;i<=n;i++) cin>>a[i],maxv=max(maxv,a[i]);
a[n+1]=maxv;
long long int sum=0;
for(int i=2;i<=n+1;i++)
if(a[i]>a[i-1]) sum+=a[i]-a[i-1];
cout<<sum<<'\n';
}
}