https://ac.nowcoder.com/acm/contest/3003比赛链接
https://ac.nowcoder.com/discuss/364961 出题人题解
A. 做游戏
https://ac.nowcoder.com/acm/contest/3003/A
尽可能让 牛牛的每次出 剪刀/石头/布 对应到 牛可乐出 布/剪刀/石头。
min(A,Y)+min(B,Z)+min(C,X) 。
时间复杂度 O(1)
#include<iostream>
#include<cmath>
typedef long long ll;//爆int
using namespace std;
int main()
{
ll a,b,c,x,y,z;
ll s;
cin>>a>>b>>c;
cin>>x>>y>>z;
s=min(a,y)+min(b,z)+min(c,x);
cout<<s<<endl;
return 0;
}
B. 排数字
https://ac.nowcoder.com/acm/contest/3003/B
111 和 666 以外不需要考虑。
要让 616 子串最多一定是 61616… ,这样后面的串可以用前面的 666 ,(可以理解为前面一个 6后面 16 循环)
时间复杂度 O(∣S∣)。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a;
int s,x,y;
int ans;
cin>>s;
for(int i=0;i<s;i++)
{
cin>>a;
if(a=='1') x++;
if(a=='6') y++;
}
if(x==0||y==0)
ans=0;
else ans=min(x,y-1);
cout<<ans<<endl;
return 0;
}
c.算概率
https://ac.nowcoder.com/acm/contest/3003/C
f(i,j)表示前i道题做对j道题的概率
转移方程:f(i,j)=f(i-1,j) *(1-pi)+f(i-1,j-1)*pi
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long a[2005],f[2005][2005];
int main(){
int n;
cin>>n;
f[0][0]=1;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
f[i][0]=f[i-1][0]*(mod+1-a[i])%mod;
for(int j=1;j<=i;j++) f[i][j]=((mod+1-a[i])*f[i-1][j]+a[i]*f[i-1][j-1])%mod;
}
for(int i=0;i<=n;i++) cout<<f[n][i]<<" ";
return 0;
}
D.数三角形
利用三角形三边关系 a^2+b^2<c^2枚举钝角三角形,注意判断三点是否共线
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int x[N],y[N];
int main()
{
int n,res;
cin>>n;
for(int i=0;i<n;i++)
cin>>x[i]>>y[i];
if(n<3)
{cout<<"0"<<endl;return 0;}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k=j+1;k<n;k++)
{
int a=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);//边长
int b=(x[i]-x[k])*(x[i]-x[k])+(y[i]-y[k])*(y[i]-y[k]);
int c=(x[k]-x[j])*(x[k]-x[j])+(y[k]-y[j])*(y[k]-y[j]);
if((a+b<c||a+c<b||b+c<a)&&(x[i]-x[j])*(y[i]-y[k])!=(y[i]-y[j])*(x[i]-x[k]))//斜率法判断不共线
res++;
}
cout<<res<<endl;
return 0;
}
E.做计数
https://ac.nowcoder.com/acm/contest/3003/E
两边平方得 i+j+2√ij=k,所以ij为完全平方数,枚举1—n中的完全平方数,
再枚举这个完全平方数的因数,统计答案。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,x;
int k,m;
cin>>n;
for(int i=1;i<=sqrt(n);i++)
{
int k=i*i;
for(int j=1;j*j<=k;j++)
if(j==i) m+=1;
else if(k%j==0) m+=2;
}
cout<<m<<endl;
return 0;
}
F.拿物品
https://ac.nowcoder.com/acm/contest/3003/F
实际是按照(a+b)值最大情况的贪心,出题人详细解释
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct node{
int a,b,id;
}m[N];
bool cmp(node u,node v)
{
return u.a+u.b>v.a+v.b;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m[i].a;
m[i].id=i;
}
for(int i=1;i<=n;i++)
cin>>m[i].b;
sort(m+1,m+n+1,cmp);
for(int i=1;i<=n;i+=2)
cout<<m[i].id<<" ";
cout<<endl;
for(int i=2;i<=n;i+=2)
cout<<m[i].id<<" ";
cout<<endl;
return 0;
}
G.判正误
用快速幂模板,值太大需要取模
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=1e9+10;
ll qmi(ll m, ll k)
{
ll res = 1 % mod, t = m;
while (k)
{
if (k&1) res = res * t % mod;
t = t * t % mod;
k >>= 1;
}
return res;
}
int main()
{
ll t,a,b,c,d,e,f,g;
cin>>t;
while(t--)
{
cin>>a>>b>>c>>d>>e>>f>>g;
ll s=qmi(a,d)+qmi(b,e)+qmi(c,f);
if(s==g)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}