暑假集训7月16日
补题
H
#include <bits/stdc++.h> using namespace std; const int N=1e5+10; int a[N]; int pos[55]; int b[N]; signed main() { int n; cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=n;i>=1;i--) { int mi=0x3f3f3f3f; bool flag=1; pos[a[i]]=i; for (int j=a[i]+1;j<=50;j++) { if (mi>pos[j]&&pos[j]) { flag=0; mi=pos[j]; b[i]=j; } } if (flag)b[i]=-1; } for (int i=1;i<=n;i++)cout<<b[i]<<' '; cout<<"\n"; return 0; }
E
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N = 1e5+19; char ch[N]; int a[33]; bool cmp(int a,int b) { return a>b; } signed main() { scanf("%s", &ch); int i,j; int x; for(i = 0; ch[i]; i++) { x = ch[i]-'a'; a[x] ++; } sort(a, a+28 ,cmp); int fg = 2; long long int mi = 10000, sum; for(int i = 2; i<=a[0]; i++) { sum = 0; for(j = 0 ; a[j]>0; j++) { sum += (long long int )(a[j]%i) * a[j]; } if(sum<mi) { mi = sum; fg = i; } } printf("%d",fg); return 0; }
C 双向边记得开两倍
#include <bits/stdc++.h> using namespace std; const int N=1e4+10,M=2e5+10; bool cnt1[30],cnt2[30]; int cal(string a,string b) { memset(cnt1,0,sizeof cnt1); memset(cnt2,0,sizeof cnt2); for (int i=0; a[i]; i++) { if (a[i]>='A'&&a[i]<='Z') a[i]+=32; cnt1[a[i]-'a']=1; } for (int i=0; b[i]; i++) { if (b[i]>='A'&&b[i]<='Z') b[i]+=32; cnt2[b[i]-'a']=1; } int num=0; for (int i=0; i<26; i++) { if (cnt1[i]&&cnt2[i]) num++; } return num; } string str[N]; int n,m,en,enn; int h[N],e[M],ne[M],w[M],idx; bool st[N]; void add(int u,int v,int k) { e[idx]=v,ne[idx]=h[u],w[idx]=k,h[u]=idx++; } int dist[N]; int spfa() { memset(dist,0x3f,sizeof dist); dist[en]=0; queue<int>q; q.push(en); st[en]=1; while (q.size()) { int t=q.front(); q.pop(); st[t]=0; for (int i=h[t]; i!=-1; i=ne[i]) { int j=e[i]; if (dist[j]>dist[t]+w[i]) { dist[j]=dist[t]+w[i]; if (!st[j]) { st[j]=1; q.push(j); } } } } return dist[enn]; } signed main() { scanf("%d%d",&n,&m); memset(h,-1,sizeof h); for (int i=1; i<=n; i++) cin>>str[i]; for (int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); int num=cal(str[u],str[v]); add(u,v,num); add(v,u,num); } scanf("%d%d",&en,&enn); printf("%d\n",spfa()); return 0; }
F
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; ll a[N]; signed main() { int n; cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); int m; cin>>m; while (m--) { ll x; cin>>x; int l=1,r=n; while (l<r) { int mid=l+r>>1; if (a[mid]>=x) r=mid; else l=mid+1; } if (a[l]<x)printf("Dr. Samer cannot take any offer :(.\n"); else cout<<a[l]<<"\n"; } return 0; }
B

/* 2 把一个字符串分成若干段,每一段里面的字符不能重复,问有多少种分法 3 动态规划,定义dp 表示字符串前n个字母的分法种数,先预处理字符串,对于每个字符, 4 计算出以这个字符为结尾的无重复字符的一段最长的长度,第i个字符对应的长度记为f[i] 5 然后可以得出递推式: 6 dp[0]=1; 7 dp[i]=dp[i-j] (1<=j<=f[i]) 8 */ 9 #include <bits/stdc++.h> 10 using namespace std; 11 int dp[10005]; 12 int f[10005]; 13 bool vis[10]; 14 const int mod=1e9+7; 15 int main() 16 { 17 string s; 18 int n; 19 cin>>n>>s; 20 memset(dp,0,sizeof(dp)); 21 memset(f,0,sizeof(f)); 22 for(int i=0;i<n;i++) 23 { 24 memset(vis,0,sizeof(vis)); 25 int cnt=0; 26 for(int j=i;j>=0;j--) 27 { 28 if(vis[s[j]-'0']) 29 break; 30 cnt++; 31 vis[s[j]-'0']=1; 32 } 33 f[i+1]=cnt; 34 } 35 dp[0]=1; 36 for(int i=1;i<=n;i++) 37 { 38 int sum=0; 39 for(int j=1;j<=f[i];j++) 40 { 41 sum=(sum+dp[i-j])%mod; 42 } 43 dp[i]=sum; 44 } 45 cout<<dp[n]%mod<<endl; 46 }
K

浙公网安备 33010602011771号