Weekly Training Farm 23

14 篇文章 0 订阅
9 篇文章 0 订阅

比赛链接:Weekly Training Farm 23

A:优先队列乱搞:

#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
struct cmp
{
	bool operator () (const ll a,const ll b)
	{
		return a>b;
	}
};
int main()
{
	int n;
	while(cin>>n)
	{
		priority_queue<ll,vector<ll>,cmp> q;
		ll sum=0,t;
		int ans=0;
		for(int i=0;i<n;i++)
		{
			cin>>t;
			sum+=t;
			if(t<0)	q.push(t);
			if(sum<0)
			{
				ll tmp=q.top();q.pop();
				ans++;
				sum-=tmp;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}


B:二分检验

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double a[1007];
int n;double x;
bool check(double t)
{
	double res=0;
	for(int i=0;i<n;i++)
	{
		if(t<a[i])	res+=a[i]-t;
	}
	return res>=x;
}
int main()
{
	while(cin>>n)
	{
		double l=0,r=0;
		for(int i=0;i<n;i++)	cin>>a[i],r=max(r,a[i]);
		cin>>x;
		int cnt=5;
		while(r-l>=1e-13)
		{
			double mid=(r+l)/2;
			if(check(mid))	l=mid;
			else r=mid;
		}
		printf("%.15lf\n",r);
	}
	return 0;
}


C:简单dp,dp[i][j]表示第i位,数字填j时有多少种方案。状态转移非常容易。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
const ll mod=1e9+7;
ll dp[maxn][10];
int main()
{

	ios::sync_with_stdio(false);
	string s;
	while(cin>>s)
	{
		memset(dp,0,sizeof(dp));
		if(s[0]=='?')	for(int i=0;i<=9;i++)	dp[0][i]=1;
		else dp[0][s[0]-'0']=1;
		for(int i=1;i<s.length();i++)
			for(int j=(s[i]=='?'?0:s[i]-'0');j<=(s[i]=='?'?9:s[i]-'0');j++)
				for(int k=0;k<=j;k++)
					dp[i][j]=(dp[i-1][k]+dp[i][j])%mod;
		ll ans=0;
        for(int i=0;i<=9;i++)	ans=(ans+dp[s.length()-1][i])%mod;
        cout<<ans<<endl;
	}
	return 0;
}


E:dfs搜一下,若某棵子树是三个结点,那么这三个结点显然是一组,否则dfs返回这课子树的结点数,当一棵子树的结点数大于3时,显然不能合并。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+7;
vector<int> adj[maxn];
bool vis[maxn];
int n;
bool flag;
int dfs(int u)
{

	vis[u]=true;
	int res=1;
	for(int i=0;i<adj[u].size();i++)
	{
		int next=adj[u][i];
		//if(cnt-->0)	printf("%d %d\n",u,next);
		if(vis[next])	continue;
		res+=dfs(next);
		if(!flag)	return flag;
	}
	if(res>3)
	{
		return flag=false;
	}
	return res%3;
}
int main()
{
	ios::sync_with_stdio(false);
	while(cin>>n)
	{
		n*=3;
		for(int i=1;i<=n;i++)	adj[i].clear();
		int u,v;
		flag=true;
		for(int i=1;i<n;i++)
		{
			cin>>u>>v;
			adj[u].push_back(v);
			adj[v].push_back(u);
		}
		memset(vis,0,sizeof(vis));
		dfs(1);
		if(flag)	cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值