AtCoder Beginner Contest 174 题解

废话

这篇博客只是本着不写白不写的想法写的,所以比较水qwq……

T1

按题目说的做就好了。

#include <cstdio>
 
int n;
 
int main()
{
    
    
	scanf("%d",&n);
	if(n>=30)printf("Yes");
	else printf("No");
}

T2

判断一下每个点是否满足就好。

#include <cstdio>
#define ll long long
 
int n,ans=0;ll d;
 
int main()
{
    
    
	scanf("%d %lld",&n,&d);
	ll x,y;for(int i=1;i<=n;i++){
    
    
		scanf("%lld %lld",&x,&y);
		if(x*x+y*y<=d*d)ans++;
	}printf("%d",ans);
}

T3

模拟一下,找到循环节了就是无解。

#include <cstdio>
 
int k;
bool v[1000010];
 
int main()
{
    
    
	scanf("%d",&k);
	for(int i=1,now=7%k;;i++){
    
    
		if(v[now])return printf("-1"),0;
		if(!now)return printf("%d",i),0;
		v[now]=true;now=now*10+7;now%=k;
	}
}

T4

将所有 W W W 放到后面就好了,只需要交换操作。

#include <cstdio>
 
int n,W=0;
char s[200010];
 
int main()
{
    
    
	scanf("%d %s",&n,s+1);
	for(int i=1;i<=n;i++)if(s[i]=='W')W++;
	for(int i=n-W+1;i<=n;i++)if(s[i]=='W')W--;
	printf("%d",W);
}

T5

二分答案板子题。

#include <cstdio>
#define maxn 200010
#define ll long long
 
int n,a[maxn];ll m;
ll check(int x){
    
    
	ll re=0;
	for(int i=1;i<=n;i++)re+=a[i]/x+(a[i]%x>0)-1;
	return re;
}
 
int main()
{
    
    
	scanf("%d %lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	int l=1,r=1e9,mid,ans;
	while(l<=r){
    
    
		mid=l+r>>1;
		if(check(mid)<=m)ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%d",ans);
}

T6

原题,HH的项链。

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 500010
 
int n,m,a[maxn];
struct que{
    
    int x,y,pos;}ask[maxn];
int last[maxn],ans[maxn];
int tr[maxn];
void add(int x,int y){
    
    for(;x<=maxn-5;x+=(x&-x))tr[x]+=y;}
void Add(int x,int y){
    
    add(x,1);add(y+1,-1);};
int sum(int x){
    
    int re=0;for(;x>=1;x-=(x&-x))re+=tr[x];return re;}
bool cmp(que x,que y){
    
    return x.y<y.y;}
 
int main()
{
    
    
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)scanf("%d %d",&ask[i].x,&ask[i].y),ask[i].pos=i;
	sort(ask+1,ask+m+1,cmp);
	int now=1;for(int i=1;i<=n;i++){
    
    
		Add(last[a[i]]+1,i);last[a[i]]=i;
		while(now<=m&&ask[now].y==i)ans[ask[now].pos]=sum(ask[now].x),now++;
		if(now>m)break;
	}
	for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

猜你喜欢

转载自blog.csdn.net/a_forever_dream/article/details/107759230
今日推荐