思路:水题,小于s[0]的一定被按过10次,本身一定被按过(1+2+…+s.length())次,附上代码
#include <iostream> #include <string> using namespace std; int main(){ int t; cin>>t; while(t--){ string s; cin>>s; cout<<(s[0]-'1')*10+(s.length()+1)*s.length()/2<<endl; } return 0; }思路:因为可以整体移动,只需要数最两边一之间零的个数,这就很好求了,我这里提供一种方法。
#include <iostream> #include <string> using namespace std; const int N=110; int a[N]; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; bool flag=false; int cnt=0,ans=0; for(int i=0;i<n;++i){ if(a[i]) flag=true; if(flag) if(!a[i]) cnt++; else ans+=cnt,cnt=0; } cout<<ans<<endl; } return 0; }思路:只要保证无论什么时候两边都存在比他小的就行,我们只需要找到一个最大值,并且旁边存在比他小的数就可以保证上述条件。因为本身就是最大值吃掉旁边比它小的🐟,自身加一以后,就没有鱼比它更懂吃鱼。
#include <iostream> #include <string> #include <algorithm> using namespace std; const int N=3e5+10; int a[N]; bool book[N]; int n; bool f(){ for(int i=2;i<=n;i++) if(a[1]!=a[i]) return false; return true; } int main(){ int t; cin>>t; while(t--){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int maxn = *max_element(a+1,a+n+1); int t=0; for(int i=2;i<n;i++){ if(a[i]==maxn&&(a[i]!=a[i-1]||a[i]!=a[i+1])) t=i; } if(a[1]==maxn&&a[1]!=a[2]) t=1; if(a[n]==maxn&&a[n]!=a[n-1]) t=n; cout<<(f()?-1:t)<<endl; } return 0; }思路:经过分析,只要所有的地方不属于一个帮派,就能够实现。比如说所有不和第一个相等的就像连,依次遍历。
#include <iostream> #include <string> #include <cstring> using namespace std; const int N=5010; int a[N]; bool book[N]; int n; bool f(){ for(int i=2;i<=n;i++) if(a[1]!=a[i]) return false; return true; } int main(){ int t; cin>>t; while(t--){ memset(book,0,sizeof(book)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; if(f()) cout<<"NO"<<endl; else{ cout<<"YES"<<endl; for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ if(book[j]) continue; if(a[i]!=a[j]) book[i]=true,book[j]=true,cout<<i<<" "<<j<<endl; } } } } return 0; }思路:这题只有一个公式,思路很明确。通过阶乘求容易爆long long。 a n s = A n − 1 n / 2 − 1 ⋅ A n / 2 − 1 n / 2 − 1 ans=A_{n-1}^{n/2-1}\cdot A_{n/2-1}^{n/2-1} ans=An−1n/2−1⋅An/2−1n/2−1
#include <iostream> #include <string> #include <cstring> using namespace std; typedef long long ll; ll a(int n,int m){ ll ans=1; while(m){ ans*=n; n--; m--; } return ans; } int main(){ ll n; cin>>n; cout<<a(n-1,n/2-1)*a(n/2-1,n/2-1)<<endl; return 0; }思路:先写个题解,实在是佩服。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 80; const int INF = 0x3f3f3f3f; int a[N][N]; int dp[N][N][N][N/2]; int n,m,k; int solve(int x,int y,int mod,int cnt) { if(x==0) return mod?-INF:0; if(y==0 || cnt==0) return solve(x-1,m,mod,m/2); if(dp[x][y][mod][cnt]!=-1) return dp[x][y][mod][cnt]; return dp[x][y][mod][cnt]=max(solve(x,y-1,mod,cnt),a[x][y]+solve(x,y-1,(mod+a[x][y])%k,cnt-1)); } int main() { cin>>n>>m>>k; memset(dp,-1,sizeof(dp)); for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j) cin>>a[i][j]; cout<<solve(n,m,0,m/2)<<endl; return 0; }思路:这代码都能过,直接裂开。
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int N=1010; const int INF=0x3f3f3f3f; int g[N][N],u[N*N],v[N*N],w[N*N],a[N],b[N]; int n,m,k; int main() { cin>>n>>m>>k; memset(g,0x3f,sizeof g); for(int i=1; i<=n; ++i) g[i][i]=0; for(int i=1; i<=m; ++i) cin>>u[i]>>v[i]>>w[i], g[u[i]][v[i]]=g[v[i]][u[i]]=min(g[u[i]][v[i]],w[i]); for(int i=1; i<=k; ++i) cin>>a[i]>>b[i]; for(int k=1; k<=n; ++k) for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) g[i][j]=min(g[i][j],g[i][k]+g[k][j]); int res=INF; for(int i=1; i<=m; ++i) { int sum=0; for(int j=1; j<=k; ++j) sum+=min({g[a[j]][b[j]],g[a[j]][u[i]]+g[v[i]][b[j]],g[b[j]][u[i]]+g[v[i]][a[j]]}); res=min(res,sum); } cout<<res<<endl; return 0; }