牛客挑战赛58

A:[NCT058A] 签到题
链接:https://ac.nowcoder.com/acm/contest/11198/A

签到题没啥好说的

code:

#include<bits/stdc++.h>
using namespace std;

int n,q;
int a[1000011];
int main()
{cin>>n>>q;
for(int i=0;i<n;i++)
{
	scanf("%d",&a[i]);
}
sort(a,a+n);
int x,y;
double t;
while(q--)
{
	scanf("%d%d",&x,&y);
	t=sqrt(x*1.0*x+y*1.0*y);
	printf("%d\n",upper_bound(a,a+n,t)-a);
    
}
	
}

B:[NCT058B] 签到题
链接:https://ac.nowcoder.com/acm/contest/11198/B

这个题很好!

关键在于拆分为 (1)每一位计数 (2)想到要找到那个分界点 (3)异或的性质和或的性质充分利用

这个题真的超级棒
code:

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
ll ans=0;
int n,m;
ll ksm(ll aa,ll bb){
	ll res=1;
	while(bb){
		if(bb&1)res=res*aa%mod;
		aa=aa*aa%mod;
		bb>>=1;
	}
	return res;
}
int main(){
    cin>>n>>m;
	ll k=(ksm(2,n-1)*(ksm(2,n)+mod-1)%mod)%mod;
	ll a1=ksm(2,2*n-1);
	ll a2=ksm(2,2*n);
	ans=ksm(a1,m);
	for(int i=1;i<=m;i++)
		ans=(ans+ksm(a1,i-1)*k%mod*ksm(a2,m-i)%mod)%mod;
		cout<<ans<<endl;
     return 0;
}

C:[NCT058C1] 简单题

链接:https://ac.nowcoder.com/acm/contest/11198/C

分析:首先很容易想到二分时间T

观察到堡垒的战斗力都是一次函数,于是仅在 0 或 T 进行操作一定不劣(可以分四种情况)

此时,问题的判定变得简单起来。我们考虑在 0 时刻将手中的每一个堡垒替换成它此刻能打败的堡垒中,在 T 时刻战斗力最大的堡垒。

因为下一次操作就是在 T 时刻了,所以城堡的价值要用 T 时刻的战斗力来衡量。

找到能替换的最优堡垒可以考虑将 2n 个堡垒排序,然后二分即可。

这个题看似简单 实则还是有难度

code:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1000010;

struct Node {
	ll k,b,op;
}p[N];

bool cmp(Node a,Node b){
	if(a.b!=b.b)
	return a.b<b.b;
}
int n;
bool check(ll mid){
	vector<ll>v1;
	vector<ll>v2;
	ll mx=-1e18;
	for(int i=1;i<=n*2;i++){
		ll now=p[i].b+mid*p[i].k;
		mx=max(mx,now);
		if(p[i].op) v2.push_back(now);
		else v1.push_back(mx);
	}
	
	sort(v1.begin(),v1.end());
	sort(v2.begin(),v2.end());
	int len=v1.size();
	for(int i=0;i<len;i++){
		if(v1[i]<v2[i]) return 0;
	}
	return 1;
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>p[i].k>>p[i].b;
	for(int i=n+1;i<=n*2;i++) cin>>p[i].k>>p[i].b;
	for(int i=n+1;i<=n*2;i++) p[i].op=1;
	sort(p+1,p+1+n*2,cmp);
	
	ll l=0,r=1e9;
	while(l<=r) {
		ll mid=l+r>>1;
		if(check(mid)) r=mid-1;
		else l=mid+1;
	}
	if(l==1e9+1) cout<<"Can't win!";
	else cout<<l<<"\n";
} 
posted @ 2022-07-14 17:40  wzx_believer  阅读(15)  评论(0编辑  收藏  举报