| 题目 | 难度 | 知识点 |
|---|---|---|
| A 夹心饼干! | ★ | 签到 |
| B 食堂大作战1.0 | ★ | 签到 |
| C 食堂大作战2.0 | ★ | 签到 |
| D 小苯的排列计数 | ★ | 思维/找规律 |
| E 和+和 | ★ ★ | 思维 |
| F 怎么写线性SPJ | ★★ | 构造 |
最后一题构造题没看懂,不太会写。
夹心饼干
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],t,n;
int main(void)
{
string s; cin>>s;
if(s[0]==s[2]) puts("YES");
else puts("NO");
return 0;
}
食堂大作战1.0
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],t,n;
int main(void)
{
cin>>n;
map<int,int>mp;
for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
int flag=1;
for(int i=0;i<n;i++) if(mp[a[i]]>1) flag=0;
if(flag) puts("YES");
else puts("NO");
return 0;
}
食堂大作战2.0
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],n;
set<int>st;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],st.insert(a[i]);
if(st.size()!=n) puts("NO");
else{
puts("YES");
vector< pair<int,int> >ve;
for(int i=1;i<=n;i++) ve.push_back({a[i],i});
sort(ve.begin(),ve.end());
for(int i=0;i<ve.size();i++) cout<<ve[i].second<<" ";
}
return 0;
}
小苯的排列计数
6 2 2 1 1 1 1 6 2 (3,4,5,7) 1 (3!)=4*3! 可以找到规律
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
const int mod=998244353;
typedef long long int LL;
LL a[N],t,n;
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
LL temp=1e9,flag=1;
for(int i=1;i<=n;i++)
{
if(a[i]>temp) flag=0;
temp=min(temp,a[i]);
}
if(flag)
{
LL sum=1;
for(int i=1;i<=n;i++)
{
int j=i;
while(j+1<=n&&a[j+1]==a[i]) j++;
int len=j-i+1;
for(LL k=(n-a[i]-(i-1)),cnt=1;cnt<=len-1;cnt++,k--) sum=sum*k%mod;
i=j;
}
cout<<sum%mod<<'\n';
}else puts("0");
}
int main(void)
{
cin>>t;
while(t--) solve();
return 0;
}
和+和
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
const int mod=998244353;
typedef long long int LL;
LL a[N],b[N],n,k;
LL s1[N],s2[N];
int main(void)
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
priority_queue<int>q1,q2;
for(int i=1;i<=k;i++) s1[i]=s1[i-1]+a[i],q1.push(a[i]);
for(int i=k+1;i<=n;i++)
{
if(a[i]<q1.top())
{
s1[i]=s1[i-1]-q1.top()+a[i];
q1.pop(); q1.push(a[i]);
}else s1[i]=s1[i-1];
}
for(int i=n,j=1;i>=1&&j<=k;i--,j++) s2[i]=s2[i+1]+b[i],q2.push(b[i]);
for(int i=n-k;i>=1;i--)
{
if(b[i]<q2.top())
{
s2[i]=s2[i+1]-q2.top()+b[i];
q2.pop(); q2.push(b[i]);
}else s2[i]=s2[i+1];
}
LL ans=1e18;
for(int i=1;i<=n;i++)
{
int len1=i;
int len2=n-i;
if(len1>=k&&len2>=k) ans=min(ans,s1[i]+s2[i+1]);
}
cout<<ans;
return 0;
}
怎么写线性SPJ
1
12
121
1213
12131
121312
1213121
12131214
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
int now=1;
vector<int>ans;
while(ans.size()<n)
{
vector<int>temp;
for(int i=0;i<(int)ans.size()-1;i++)
temp.push_back(ans[i]);
temp.push_back(now);
for(int i=0;i<temp.size();i++)
{
ans.push_back(temp[i]);
if(ans.size()==n) break;
}
now++;
}
set<int>st;
for(int i=0;i<ans.size();i++) st.insert(ans[i]);
cout<<st.size()<<'\n';
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
return 0;
}