CF677.3补题

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=An1n/21An/21n/21

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值