A. Boring Apartments
思路:水题,小于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;
}
B. Yet Another Bookshelf
思路:因为可以整体移动,只需要数最两边一之间零的个数,这就很好求了,我这里提供一种方法。
#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;
}
C. Dominant Piranha
思路:只要保证无论什么时候两边都存在比他小的就行,我们只需要找到一个最大值,并且旁边存在比他小的数就可以保证上述条件。因为本身就是最大值吃掉旁边比它小的🐟,自身加一以后,就没有鱼比它更懂吃鱼。
#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;
}
D. Districts Connection
思路:经过分析,只要所有的地方不属于一个帮派,就能够实现。比如说所有不和第一个相等的就像连,依次遍历。
#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;
}
E. Two Round Dances
思路:这题只有一个公式,思路很明确。通过阶乘求容易爆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;
}
F. Zero Remainder Sum
思路:先写个题解,实在是佩服。
#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;
}
G. Reducing Delivery Cost
思路:这代码都能过,直接裂开。
#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;
}