文章目录
- B 智乃买瓜 dp
- C 智乃买瓜h dp
- E 智乃的数字积木(easy version) 暴力模拟
- F 智乃的数字积木(hard version) 【待补
- G 智乃的树旋转(easy version) 思维
- H 智乃的树旋转(hard version) 【待补
- I 智乃的密码 尺取/二分
- J 智乃的C语言模除方程 分类讨论 【待补
- K 智乃的C语言模除方程(another version) 【待补
- 总结
比赛链接
B 智乃买瓜 dp
题目链接
题意:
( 1 < = n < = 1 e 3 , 1 < a i < = 1 e 3 ) (1<=n<=1e3,1<ai<=1e3) (1<=n<=1e3,1<ai<=1e3)
题解:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int M=1e9+7;
int a[N];
int dp[N];
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0); cout.tie(0);
int n, m;
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>a[i];
dp[0]=1;
for(int i=1; i<=n; i++) {
for(int j=m; j>=0; j--) {
if(j>=a[i]) dp[j]=(dp[j]+dp[j-a[i]])%M;
if(j>=a[i]/2) dp[j]=(dp[j]+dp[j-a[i]/2])%M;
}
}
for(int i=1; i<=m; i++) {
cout<<dp[i]%M<<" ";
}
return 0;
}
C 智乃买瓜h dp
题目链接
题意:
题解:
i的方案数 等于 i自己的个数 + 其他组合的和等于i 的方案数
i自己的个数 等于 i的方案数 - 其他组合的和等于i 的方案数
i的方案数已知
其他组合的和等于i的方案数就是背包过来的
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
const int M=1e9+7;
int dp[N];
int a[N];
int num[N];
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0); cout.tie(0);
int n;
cin>>n;
dp[0]=1;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
int cnt=0;
for(int i=2; i<=n+n; i+=2) {
int p=((a[i/2]-dp[i/2]+M)%M);
for(int j=1; j<=p; j++) {
for(int k=n; k>=0; k--) {
if(k>=i) dp[k]=(dp[k]+dp[k-i])%M;
if(k>=i/2) dp[k]=(dp[k]+dp[k-i/2])%M;
}
}
num[i]=p;
cnt+=num[i];
}
if(cnt) {
cout<<cnt<<endl;
for(int i=1; i<=n+n+2; i++) {
for(int j=1; j<=num[i]; j++) {
cout<<i<<" ";
}
}
cout<<endl;
return 0;
}else {
cout<<1<<endl;
cout<<n*2+2<<endl;
}
return 0;
}
E 智乃的数字积木(easy version) 暴力模拟
题目链接
题意:
题解:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a, n, b;
int in[N], inn[N];
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0); cout.tie(0);
int n;
cin>>n;
for(int i=1; i<=n; i++) {
int a, b;
cin>>a>>b;
in[a]=i;
in[b]=i;
}
for(int i=1; i<=n; i++) {
int a, b;
cin>>a>>b;
inn[a]=i;
inn[b]=i;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(in[i]==j&&inn[j]==i) {
cout<<1<<endl<<j<<endl;
return 0;
}
}
}
cout<<0<<endl;
return 0;
}
F 智乃的数字积木(hard version) 【待补
题目链接
题意:
题解:
G 智乃的树旋转(easy version) 思维
题目链接
题意:
题解:
父亲-儿子 ->儿子-父亲
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a, n, b;
int in[N], inn[N];
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0); cout.tie(0);
int n;
cin>>n;
for(int i=1; i<=n; i++) {
int a, b;
cin>>a>>b;
in[a]=i;
in[b]=i;
}
for(int i=1; i<=n; i++) {
int a, b;
cin>>a>>b;
inn[a]=i;
inn[b]=i;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(in[i]==j&&inn[j]==i) {
cout<<1<<endl<<j<<endl;
return 0;
}
}
}
cout<<0<<endl;
return 0;
}
H 智乃的树旋转(hard version) 【待补
题目链接
题意:
题解:
I 智乃的密码 尺取/二分
题目链接
题意:
题解:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7;
const int maxn=1100;
int n, m;
int L, R;
int sum[N][10];
string s;
signed main() {
cin>>n>>L>>R;
cin>>s;s=','+s;
for(int i=1;i<=n;i++) {
for(int j=1; j<=4; j++) sum[i][j]=sum[i-1][j];
if(s[i]>='A'&&s[i]<='Z') sum[i][1]++;
else if(s[i]>='a'&&s[i]<='z') sum[i][2]++;
else if(s[i]>='0'&&s[i]<='9') sum[i][3]++;
else sum[i][4]++;
}
int ans=0;
for(int i=1;i<=n-L+1;i++) {
int l=i+L-1, r=min(i+R-1, n);
int res=-1;
while(l<=r) {
int mid=(l+r)/2;
if(min(1ll, sum[mid][1]-sum[i-1][1])+min(1ll,sum[mid][2]-sum[i-1][2])+min(1ll,sum[mid][3]-sum[i-1][3])+min(1ll,sum[mid][4]-sum[i-1][4])>=3) {
r=mid-1;
res=mid;
}else {
l=mid+1;
}
}
if(res!=-1) {
ans+=min(i+R-1, n)-res+1;
}
}
cout<<ans<<endl;
}
J 智乃的C语言模除方程 分类讨论 【待补
题目链接
题意:
题解:
K 智乃的C语言模除方程(another version) 【待补
题目链接
总结
Qwq