战况:VP,结果灰常打脸噢。Q友们有的AK了,有的5题了,而我只能勉强算是个3题。A题水过,B题因<=写成>=WA了一次后来AC,C题卡住了,D题过了(但是过的时候已经超时了10分钟)。目前ABCDE已补,缺F;
题意:输入一个整数判断是否>=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,y的范围是 ,一乘就超过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。
时间复杂度:
代码:
#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;
}
题意:输入n和长度为n的字符串,其中包含’R’和’W’两种字符。每一步可以调换两个字符,或者更改为另一种字符,问要使得’W’不在’R’的左边,即形如"RRR…RWW…W"最少需要多少步。
思路:用类似前缀和的思想,扫描一遍字符串,并用b[N][2]表示到第i个字符时共有多少个W(0)和R(1),最后统一出r的个数,那么该数前有多少个W字符,即需要多少操作(b[r][0])。
时间复杂度:
代码:
#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次,再求和。
时间复杂度:
代码:
#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;
}