1.签到:https://ac.nowcoder.com/acm/contest/82394/A
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
cin>>n;
if(n%2==1) cout<<-1;
else
{
cout<<n/2<<" "<<n/2;
}
}
2.暴力:https://ac.nowcoder.com/acm/contest/82394/B
注意到+2,-2奇偶性不变的性质
#include<bits/stdc++.h>
using namespace std;
long long x;
int main()
{
cin>>x;
long long ans=1e8;
for(long long i=1;i<=1e6;i++)
{
if(i*i==x)
{
cout<<0;
return 0;
}
else if(i*i<x)
{
if((x-i*i)%2==0)
{
ans=min(ans,(x-i*i)/2);
}
}
else
{
if((i*i-x)%2==0) ans=min(ans,(i*i-x)/2);
}
}
cout<<ans;
}
3.前缀和:https://ac.nowcoder.com/acm/contest/82394/C
下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int A[100010],a[100010],B[100010],b[100010];
int checkd(char c)
{
if(c>='A'&&c<='Z') return 1;
return 0;
}
int checkx(char c)
{
if(c>='a'&&c<='z') return 1;
return 0;
}
int main()
{
cin>>s;
int ck=s.size();
int ans=1e8;
s=' '+s;
for(int i=1;i<=ck;i++)
{
A[i]=A[i-1]+checkd(s[i]);
a[i]=a[i-1]+checkx(s[i]);
}
for(int i=ck;i>=1;i--)
{
B[i]=B[i+1]+checkd(s[i]);
b[i]=b[i+1]+checkx(s[i]);
}
for(int i=1;i<=ck-1;i++)
{
ans=min(ans,a[i]+B[i+1]);
}
cout<<ans;
//for(int i=1;i<=4;i++) cout<<B[i]<<" ";
//cout<<ans;
}
4.双指针:https://ac.nowcoder.com/acm/contest/82394/D
下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010];
int fk;
int n,k;
int cnt;
int main()
{
cin>>n>>k;
fk=k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
if(b[a[i]]==0&&a[i]<=k) fk--;
b[a[i]]++;
if(i==k)
{
if(fk==0) cnt++;
}
else if(i<k) continue;
else
{
b[a[i-k]]--;
if(b[a[i-k]]==0&&a[i-k]<=k) fk++;
if(fk==0) cnt++;
}
}
cout<<cnt;
}
5.向量:https://ac.nowcoder.com/acm/contest/82394/E
首先我们把任意两个点连一条边,要是平行四边形就需要两个向量相同,于是我们用map存向量(统一x>0),并用vector保存,然后就把同一个向量取出来,用两条边端点的向量与自己的向量叉乘一下即可,下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> pii;
map<pii,vector<pii> >mp;
pii a[1002];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
long long x=a[i].first-a[j].first;
long long y=a[i].second-a[j].second;
if(x<0)
{
x=-x,y=-y;
}
mp[{x,y}].push_back({i,j});
}
}
long long ans=0;
for(auto e:mp)
{
auto A=e.first;
for(auto[x,y]:e.second)
{
for(auto[xx,yy]:e.second)
{
if(x==xx&&y==yy) continue;
pii B={a[x].first-a[xx].first,a[x].second-a[xx].second};
ans=max(ans,abs(A.first*B.second-A.second*B.first));
}
}
}
if(ans==0) cout<<-1;
else cout<<ans<<".0";
}
1.签到:https://ac.nowcoder.com/acm/contest/82612/A
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t;
struct node
{
int id,zhi;
};
bool cmp(node a,node b)
{
if(a.zhi==b.zhi) return a.id>b.id;
return a.zhi<b.zhi;
}
int main()
{
cin>>t;
while(t--)
{
node a[5];
int cnt=0;
for(int i=0;i<5;i++)
{
cin>>a[i].zhi;
a[i].id=i+1;
}
sort(a,a+5,cmp);
for(int i=0;i<5;i++)
{
if(a[i].id==1) break;
cnt++;
}
cout<<4-cnt<<endl;
}
}
2.简单的博弈:https://ac.nowcoder.com/acm/contest/82612/B
注意:素数-1肯定是偶数,但是我们要特判3-1=2这种情况:
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[200010];
void init()
{
for(int i=2;i<=200000;i++)
{
int f=0;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
f=1;
break;
}
}
if(f==0) a[i]=1;
}
}
int main()
{
int t;
cin>>t;
init();
while(t--)
{
int cnt=0;
int n;
int w=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x==3) w++;
if(a[x]) cnt++;
}
if(cnt==0||cnt==w) cout<<-1<<endl;
else
{
cnt-=w;
if(cnt%2==0) cout<<1<<endl;
else cout<<0<<endl;
}
}
}
3.枚举:https://ac.nowcoder.com/acm/contest/82612/C
我们令x:abc,其中a:最高位,c:最低位,b:中间位,l:10的b的位数次方
那么y=a*l+b+b*10+c,即11*b=y-a*l-c,因此我们枚举a,c,l,计算出y-a*l-c,假如是11的倍数,并前算出来的b<l(比如3位数一定小于1000)那么答案+1.
下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int t;
typedef long long ll;
int main()
{
cin>>t;
while(t--)
{
ll y;
cin>>y;
int ans=0;
for(int a=1;a<10;a++)
{
for(int c=0;c<=9;c++)
{
for(ll l=1;l<=1e17;l*=10)
{
ll b=y-a*l-c;
if(b>=0&&b%11==0&&l>b/11) ans++;
}
}
}
cout<<ans<<endl;
}
}