第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)

F.Fountains

求贡献的题,斐波那契数列中奇数和偶数出现规律是奇数、奇数、偶数,奇数和奇数对答案没有贡献,其他组合均有贡献。求出奇数个数为p,则答案为C_{n}^{2}-C_{p}^{2}

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
int main(){
    ll n;scanf("%lld",&n);
    ll p=n/3*2+(n%3);
    ll res=n*(n-1)/2-p*(p-1)/2;
    printf("%lld\n",res);
    return 0;
}

B.Mine Sweeper II

A图的反和A图的num相等,B如果能在小于n*m/2步内变成A则直接转换成A,否则转换成A反。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N][N],b[N][N];
int main(){
	int n,m;scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++) scanf("%s",&a[i]);
	for(int i=0;i<n;i++) scanf("%s",&b[i]);
	int dif=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(a[i][j]!=b[i][j]) dif++;
		}
	}
	if(dif<=m*n/2){
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)
				b[i][j]=a[i][j];
		}
	}
	else{
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++)
				b[i][j]=(a[i][j]=='.'?'X':'.');
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cout<<b[i][j];
		}
		puts("");
	}
	return 0;
}

D.Walker

分情况讨论

1.各自独立走完全程,取min

2.对向走完全程,取min

3.二分,枚举间断点mid,p1走[0,mid],p2走[mid,n]

#include<bits/stdc++.h>
using namespace std;
double calc(double n,double p,double v){
	return min((n-p+n)/v,(p+n)/v);
}
int main(){
	double n,p1,p2;
	double v1,v2;
	int T;scanf("%d",&T);
	while(T--){
		scanf("%lf%lf%lf%lf%lf",&n,&p1,&v1,&p2,&v2);
		if(p1>p2) swap(p1,p2),swap(v1,v2);
		double ans=calc(n,p1,v1);
		ans=min(ans,calc(n,p2,v2));
		ans=min(ans,max((n-p1)/v1,p2/v2));
		double l=p1,r=p2;
		for(int i=1;i<=100;i++){
			double mid=(l+r)/2.0;
			double ans1=calc(mid,p1,v1);
			double ans2=calc(n-mid,p2-mid,v2);
			ans=min(ans,max(ans1,ans2));
			if(ans1<ans2) l=mid;
			else r=mid;
		}
		printf("%.10lf\n",ans);
	}
	return 0;
}

M.Gitignore

难在建树...

#include<bits/stdc++.h>
using namespace std;
int ans,idx;
int n,m;
struct P{
	map<string,int> mp;
	int s1=0,s0=0;
	void clear(){
		s1=0,s0=0;
		mp.clear();
	}
	int ch(string s){
		if(mp.count(s)) return mp[s];
		else return mp[s]=++idx;
	}
}tr[5005];
void insert(int type){
	int p=1;
	string s="";
	char ss[1005];
	scanf("%s",ss+1);
	for(int i=1;ss[i];i++){
		if(ss[i]=='/') p=tr[p].ch(s),s="";
		else s=s+ss[i];
	} 
	p=tr[p].ch(s);
	type==1?++tr[p].s1:++tr[p].s0;
}
void dfs(int x){
	for(auto i:tr[x].mp){
		int is=i.second;
		dfs(is);
		tr[x].s1+=tr[is].s1;
		tr[x].s0+=tr[is].s0;
	}
	if(x==1) return ;
	if(tr[x].s1&&!tr[x].s0){
		ans++;
		for(auto i:tr[x].mp)
			ans--; 
	}
}
void solve(){
	for(;idx;idx--){
		tr[idx].clear();
	}
	idx=1,ans=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) insert(1);
	for(int i=1;i<=m;i++) insert(0);
	dfs(1);
	printf("%d\n",ans);
}
int main(){
	int T;scanf("%d",&T);
	while(T--) solve();
 	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值