【Atcoder】AtCoder Beginner Contest 174

战况:VP,结果灰常打脸噢。Q友们有的AK了,有的5题了,而我只能勉强算是个3题。A题水过,B题因<=写成>=WA了一次后来AC,C题卡住了,D题过了(但是过的时候已经超时了10分钟)。目前ABCDE已补,缺F;

T1: A - Air Conditioner

题意:输入一个整数判断是否>=30,是则输出"Yes"否则"No"

思路:

代码:

#include <iostream>
using namespace std;
int main(){
	int x;
  	cin>>x;
    if(x>=30) cout<<"Yes";
    else cout<<"No";
}

T2:B - Distance

题意:n个坐标,统计到每个坐标到原点的距离小于等于d的个数

思路:坐标到原点的距离是   x x + y y \ \sqrt{x*x+y*y} 。如果不想开根号,可以用 x x + y y x*x+y*y d d d*d 做比较,但要注意:x,y的范围是 2 × e 5 2 \times e5 ,一乘就超过int范围了,所以要用long long转一下,或者直接定义成long long类型。

代码:

#include <iostream>
using namespace std;
int ans, n;
long long d, x, y;
int main(){
    cin>>n>>d;
    while(n--){
        cin>>x>>y;
        if(x*x+y*y<=d*d)
          ans++;
    }
    cout<<ans;
}

T3:C - Repsept

题意:7,77,777,7777,…的序列中,第一个能被k整除的是第几个数

思路:k的范围是[1, 1e6],假如该数能被k整除,则x%k==0,如果不能的话余数*10+7再%k,直到余数为0循环终止。这个数不会大于k。

时间复杂度: O k O(k)

代码:

#include <iostream>
using namespace std;
int k;
int main(){
	cin>>k;
	int r=0;
	for(int i=1;i<=k;i++){
		r=(r*10+7)%k;
		if(r==0){
			cout<<i;
			return 0;
		} 
	}
	cout<<-1;
	return 0;
}

T4:D - Alter Altar

题意:输入n和长度为n的字符串,其中包含’R’和’W’两种字符。每一步可以调换两个字符,或者更改为另一种字符,问要使得’W’不在’R’的左边,即形如"RRR…RWW…W"最少需要多少步。

思路:用类似前缀和的思想,扫描一遍字符串,并用b[N][2]表示到第i个字符时共有多少个W(0)和R(1),最后统一出r的个数,那么该数前有多少个W字符,即需要多少操作(b[r][0])。

时间复杂度: O ( n ) O(n)

代码:

#include <iostream>
using namespace std;
const int N=2e5+10;

int n;
char str[N];
int b[N][2];//定义:b[N][2]到第i个字符W(0)和R(1)的个数 

int main(){
	cin>>n>>str+1;
	for(int i=1;i<=n;i++){
		if(str[i]=='R') b[i][1]=b[i-1][1]+1,b[i][0]=b[i-1][0]; 
		else b[i][1]=b[i-1][1],b[i][0]=b[i-1][0]+1;
	}
	
	int r=b[n][1];//红色个数
	cout<<b[r][0];
	return 0;
}

T5:E - Logs

题意:n个木头,长度为Ai,问经过k次切割以后最小的最大长度是多少?

思路:最大中求最小,符合单调属性,所以可以用二分来做。相当于我们每次从木头中切去mid长度,要切的次数即为(ai-1)/mid次,再求和。

时间复杂度: O ( n l o g n ) O(nlogn)

代码:

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=2e5+10;
int n, k;  
int a[N];

bool check(int mid){
	int res=0;
	for(int i=0;i<n;i++)
		res+=(a[i]-1)/mid;
	return res<=k;	
}
 
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>a[i];	
	sort(a, a+n);
	
	int l=1,r=1e9;
	while(l<r){
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid+1;	
	}
	cout<<l;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_49846828/article/details/107773187