前言:
这次月赛状态不错,开了四题,上了一大波分,感觉刷题网站要成为ai✌的玩具了(悲悲!!)
A.冰冰的正多边形
先统计各种木棍的长度,最小的多边形肯定是三嘛,然后就枚举看看有没有超过三的,没有就直接输出no,如果有那最小肯定就是正三角了,直接输出3*i , i是长度为i的木棍
void solve(){
int n;
cin>>n;
vector<int> a(n+1,0);
for(int i=1;i<=n;i++) cin>>a[i];
map<int,int> q;
for(int i=1;i<=n;i++){
q[a[i]]++;
}
int op = 0;
for(int i=1;i<=100;i++){
if(q[i]>=3){
op = 1;
}
}
if(op==0){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
int m = 0;
for(int i=1;i<=100;i++){
if(q[i]>=3){
m = 3*i;
break;
}
}
cout<<m<<endl;
}
}
B.冰冰的电子邮箱
一个小(中(大))模拟,考的是基本功,做不出来的还是要多练习。。。
void solve(){
string s;
cin>>s;
string l,d;
int op = 0;
for(int i=0;i<s.length();i++){
if(s[i]=='@'){
op = 1;
}
}
if(op==0){
cout<<"No"<<endl;
return;
}
int cp = -1;
for(int i=0;i<s.length();i++){
if(s[i]=='@'){
cp = i;
break;
}
l = l + s[i];
}
for(int i=cp+1;i<s.length();i++){
d = d + s[i];
}
if(l.length()>64 || l.length()<1){
cout<<"No"<<endl;
return;
}
if(l[0]=='.' || l[l.length()-1]=='.'){
cout<<"No"<<endl;
return;
}
for(int i=0;i<l.length();i++){
if((l[i]<='9' && l[i]>='0') || (l[i]>='a' && l[i]<='z') ||
(l[i]>='A' && l[i]<='Z') || l[i]=='.'){
continue;
}
else{
cout<<"No"<<endl;
return;
}
}
if(d.length()>255 || d.length()<1){
cout<<"No"<<endl;
return;
}
if(d[0]=='.' || d[d.length()-1]=='.'){
cout<<"No"<<endl;
return;
}
if(d[0]=='-' || d[d.length()-1]=='-'){
cout<<"No"<<endl;
return;
}
for(int i=0;i<d.length();i++){
if((d[i]<='9' && d[i]>='0') || (d[i]>='a' && d[i]<='z') ||
(d[i]>='A' && d[i]<='Z') || d[i]=='.' || d[i]=='-'){
continue;
}
else{
cout<<"No"<<endl;
return;
}
}
cout<<"Yes"<<endl;
}
C 冰冰的异或
一眼看到题目,觉得是二进制,想了想应该是找规律,遂而开始打标,惊讶发现
1 2 3 4 5 6 7 8 9 10
1 1 4 4 8 8 8 8 16 16
有规律,直接模拟规律做即可,找 是属于第几部分的,然后直接Pow就行
个人觉得这题cf的div2B的难度
using LL = long long;
void solve(){
LL n;
cin>>n;
if(n==1 || n==2){
cout<<1<<endl;
return;
}
LL cp = 1;
LL cnt = 0;
while(n-1>0){
n -= cp;
cp*=2;
cnt ++;
}
LL sum = pow(2,cnt);
cout<<sum<<endl;
}
D. 冰冰的分界线
第一次用了double做卡了精度,这题最后还是考察数学,推数学公式即可 Ax+By+C=0;
用x1,x2,y1,y2 表示A,B,C
使用距离之和公式求解
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
LL gcd(LL x,LL y){
return y==0 ? x:gcd(y,x%y);
}
void solve(){
int n;
cin>>n;
vector<int> x(n+1,0),y(n+1,0);
for(int i=1;i<=n;i++) cin>>x[i];
for(int i=1;i<=n;i++) cin>>y[i];
LL ans = 0;
map<tuple<LL,LL,LL>,int> q;//用map来记录是否出现过
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
LL A = 0 ,B = 0, C = 0;
A = 1ll*2*(x[j] - x[i]);
B = 1ll*2*(y[j] - y[i]);
C = 1ll*x[i]*x[i]-1ll*x[j]*x[j] + 1ll*y[i]*y[i] - 1ll*y[j]*y[j];
LL g = gcd(A,gcd(B,C));
if(g!=0){//系数的加倍任然是同一条直线,所以要考虑除掉最大公因数
A = A/g;
B = B/g;
C = C/g;
}
if(A<0 || (B<0 && A==0)){//负数可以变为整数,也是可能是同一条线,这里也要考虑
A = -A;
B = -B;
C = -C;
}
if(!q[{A,B,C}]){//最后存就可以了,规避精度问题,转化为三个数值的问题,强!!!
ans++;
q[{A,B,C}]=1;
}
}
}
cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
}