A.
把所有都放到1号上就行了
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 int T,n,m; 5 int main() 6 { 7 scanf("%d",&T); 8 while(T--) 9 { 10 scanf("%d%d",&n,&m); 11 int s=0; 12 for(int x,i=1;i<=n;++i)scanf("%d",&x),s+=x; 13 printf("%d\n",min(m,s)); 14 } 15 }
B.
找规律,长度为k的翻转是从k开始的一个后缀拼上剩下的前缀
这个前缀可能是正着的可能是反着的,发现和n,k的奇偶性有关
1 #include<bits/stdc++.h> 2 #define maxn 5005 3 using namespace std; 4 int T,n; 5 char str[maxn]; 6 pair<string,int> s[maxn]; 7 int main() 8 { 9 scanf("%d",&T); 10 while(T--) 11 { 12 memset(str,0,sizeof(str)); 13 scanf("%d",&n); 14 scanf("%s",str+1); 15 for(int i=1;i<=n;++i) 16 { 17 string tmp; 18 for(int j=i;j<=n;++j)tmp.push_back(str[j]); 19 if((n&1)==(i&1))for(int j=i-1;j>=1;--j)tmp.push_back(str[j]); 20 else for(int j=1;j<i;++j)tmp.push_back(str[j]); 21 s[i]=make_pair(tmp,i); 22 } 23 sort(s+1,s+n+1); 24 for(int i=1;i<=n;++i)str[i]=s[1].first[i-1]; 25 printf("%s\n",str+1); 26 printf("%d\n",s[1].second); 27 } 28 }
C.
如果\(a_0,b_0\)都不为0,那么乘积就不为$0$
否则找到最小的\(a_i,b_j \neq 0\)就行了
1 #include<bits/stdc++.h> 2 #define maxn 1000005 3 using namespace std; 4 int n,m,p; 5 int a[maxn],b[maxn]; 6 int main() 7 { 8 scanf("%d%d%d",&n,&m,&p); 9 for(int i=0;i<n;++i)scanf("%d",&a[i]),a[i]%=p; 10 for(int i=0;i<m;++i)scanf("%d",&b[i]),b[i]%=p; 11 int i=0,j=0; 12 while(1) 13 { 14 if(a[i]!=0&&b[j]!=0) 15 { 16 printf("%d\n",i+j); 17 break; 18 } 19 if(!a[i])i++; 20 if(!b[j])j++; 21 } 22 }
D.
考虑每种东西都是一个连通块
不是\((-1,-1)\)的话,我们bfs出来这个连通块就行了,反着定向回去
是\((-1,-1)\)的话,如果一个格子显然不合法;否则一定有相邻两个格子,我们构造在这两个格子来回走,其他格子指向这两个格子就行了
1 #include<bits/stdc++.h> 2 #define maxn 1005 3 using namespace std; 4 int n; 5 int bx[maxn][maxn],by[maxn][maxn]; 6 char Ans[maxn][maxn]; 7 bool vis[maxn][maxn]; 8 void bfs(int sx,int sy) 9 { 10 queue< pair<int,int> > q; 11 Ans[sx][sy]='X'; 12 q.push(make_pair(sx,sy)); 13 vis[sx][sy]=1; 14 while(!q.empty()) 15 { 16 pair<int,int> u=q.front();q.pop(); 17 int x=u.first,y=u.second; 18 if(bx[x-1][y]==sx&&by[x-1][y]==sy&&!vis[x-1][y])Ans[x-1][y]='D',vis[x-1][y]=1,q.push(make_pair(x-1,y)); 19 if(bx[x+1][y]==sx&&by[x+1][y]==sy&&!vis[x+1][y])Ans[x+1][y]='U',vis[x+1][y]=1,q.push(make_pair(x+1,y)); 20 if(bx[x][y-1]==sx&&by[x][y-1]==sy&&!vis[x][y-1])Ans[x][y-1]='R',vis[x][y-1]=1,q.push(make_pair(x,y-1)); 21 if(bx[x][y+1]==sx&&by[x][y+1]==sy&&!vis[x][y+1])Ans[x][y+1]='L',vis[x][y+1]=1,q.push(make_pair(x,y+1)); 22 } 23 } 24 void dfs(int x,int y) 25 { 26 vis[x][y]=1; 27 if(bx[x-1][y]==-1&&!vis[x-1][y])Ans[x-1][y]='D',dfs(x-1,y); 28 if(bx[x+1][y]==-1&&!vis[x+1][y])Ans[x+1][y]='U',dfs(x+1,y); 29 if(bx[x][y-1]==-1&&!vis[x][y-1])Ans[x][y-1]='R',dfs(x,y-1); 30 if(bx[x][y+1]==-1&&!vis[x][y+1])Ans[x][y+1]='L',dfs(x,y+1); 31 } 32 int main() 33 { 34 scanf("%d",&n); 35 for(int i=1;i<=n;++i) 36 for(int j=1;j<=n;++j)scanf("%d%d",&bx[i][j],&by[i][j]); 37 for(int i=1;i<=n;++i) 38 for(int j=1;j<=n;++j)if(bx[i][j]==i&&by[i][j]==j) 39 { 40 bfs(i,j); 41 } 42 for(int i=1;i<=n;++i) 43 for(int j=1;j<=n;++j)if(bx[i][j]==-1&&!vis[i][j]) 44 { 45 if(bx[i-1][j]!=-1&&bx[i+1][j]!=-1&&bx[i][j-1]!=-1&&bx[i][j+1]!=-1)continue; 46 if(bx[i-1][j]==-1)Ans[i][j]='U',dfs(i,j); 47 else if(bx[i+1][j]==-1)Ans[i][j]='D',dfs(i,j); 48 else if(bx[i][j-1]==-1)Ans[i][j]='L',dfs(i,j); 49 else if(bx[i][j+1]==-1)Ans[i][j]='R',dfs(i,j); 50 } 51 bool yes=1; 52 for(int i=1;i<=n;++i) 53 for(int j=1;j<=n;++j)if(Ans[i][j]<'A'||Ans[i][j]>'Z')yes=0; 54 if(!yes)puts("INVALID"); 55 else 56 { 57 puts("VALID"); 58 for(int i=1;i<=n;++i)printf("%s\n",Ans[i]+1); 59 } 60 }
E.
显然\(a\)肯定是选从大到小的前\(p+k\)个里的
那么我们对\(a\)排序,统计前\(k\)个作为基础答案
考虑DP,\(dp[i][S]\)表示选到第\(i\)个状态为\(S\)的答案
假设\(|S|=t\),那么\(i \leq t+k\)的话必须替换一个\(a_{t+k+1}\)进来,否则直接加入就行了
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define maxn 100005 4 using namespace std; 5 int n,p,k; 6 struct Node 7 { 8 int val; 9 int s[9]; 10 }a[maxn]; 11 bool cmp(Node A,Node B){return A.val>B.val;} 12 ll dp[maxn][130]; 13 int main() 14 { 15 scanf("%d%d%d",&n,&p,&k); 16 for(int i=1;i<=n;++i)scanf("%d",&a[i].val); 17 for(int i=1;i<=n;++i) 18 for(int j=0;j<p;++j)scanf("%d",&a[i].s[j]); 19 sort(a+1,a+n+1,cmp); 20 ll sum=0; 21 for(int i=1;i<=k;++i)sum+=a[i].val; 22 dp[0][0]=sum; 23 for(int i=1;i<=n;++i) 24 { 25 for(int S=0;S<(1<<p);++S) 26 { 27 dp[i][S]=max(dp[i][S],dp[i-1][S]); 28 int num=0; 29 for(int j=0;j<p;++j)if(S&(1<<j))num++; 30 for(int j=0;j<p;++j)if(!(S&(1<<j))) 31 { 32 if(i<=k+num)dp[i][S|(1<<j)]=max(dp[i][S|(1<<j)],dp[i-1][S]-a[i].val+a[k+num+1].val+a[i].s[j]); 33 else dp[i][S|(1<<j)]=max(dp[i][S|(1<<j)],dp[i-1][S]+a[i].s[j]); 34 } 35 } 36 } 37 ll ans=0; 38 for(int S=0;S<(1<<p);++S)ans=max(ans,dp[n][S]); 39 cout<<ans<<endl; 40 }
来源:https://www.cnblogs.com/uuzlove/p/12421401.html