https://ac.nowcoder.com/acm/contest/5600#question
目录
AOE还是单体?【贪心】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL a[N],n,x,sum;
map<int,int>mp;
vector< pair<int,int> >ve;
int main(void)
{
cin>>n>>x;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]++;
sum+=a[i];
}
for(auto i=mp.begin();i!=mp.end();i++)
ve.push_back({
i->first,i->second});
LL index=-1;
for(int i=0;i<ve.size();i++)
{
int cnt=ve.size()-i;//剩余人数
if(cnt>x) index=i;
}
if(index==-1) cout<<sum;
else
{
LL ans=ve[index].first*x;
for(int i=index+1;i<ve.size();i++)
ans+=(ve[i].first-ve[index].first)*ve[i].second;
cout<<ans;
}
return 0;
}
k-size字符串【组合数】
先鸽了。
白魔法师【并查集】
先将所有连通的黑的集合到一块,白的集合到一块。
然后枚举黑的点即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int h[N],e[N],ne[N],idx;
int p[N],siz[N],n;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(void)
{
memset(h,-1,sizeof h);
cin>>n;
string s; cin>>s;
for(int i=1;i<=n;i++) p[i]=i,siz[i]=1;
for(int i=1;i<=n-1;i++)
{
int a,b; cin>>a>>b;
add(a,b),add(b,a);
if(s[a-1]==s[b-1]&&find(a)!=find(b))
{
siz[find(a)]+=siz[find(b)];
p[find(b)]=find(a);
}
}
int ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='W') ans=max(ans,siz[find(i+1)]);
else
{
int sum=1;
for(int j=h[i+1];j!=-1;j=ne[j])
{
int u=e[j];
if(s[u-1]=='W') sum+=siz[find(u)];
}
ans=max(ans,sum);
}
}
cout<<ans;
return 0;
}
抽卡【容斥 概率】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
const int mod=1e9+7;
LL s1[N],s2[N],n,sum1,sum2,sum3;
LL qsm(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1) sum=(sum*a)%p;
b>>=1;
a=(a*a)%p;
}
return sum%p;
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>s1[i];
for(int i=1;i<=n;i++) cin>>s2[i];
sum1=1,sum2=1,sum3=1;
for(int i=1;i<=n;i++)
{
sum1=(sum1*(s1[i]-s2[i]))%mod;
sum2=sum2*qsm(s1[i],mod-2,mod)%mod;
sum3=(sum3*s1[i]%mod);
}
LL sum=(sum3-sum1+mod)%mod;
sum=(sum*sum2)%mod;
cout<<sum;
return 0;
}
点击消除【模拟】
#include<bits/stdc++.h>
using namespace std;
deque<char>q;
int main(void)
{
string s; cin>>s;
for(int i=0;i<s.size();i++)
{
q.push_back(s[i]);
while(q.size()>=2)
{
auto a=q.back(); q.pop_back();
auto b=q.back(); q.pop_back();
if(a==b) continue;
else
{
q.push_back(b);
q.push_back(a);
break;
}
}
}
if(q.size()==0) cout<<0;
while(q.size()) cout<<q.front(),q.pop_front();
return 0;
}
疯狂的自我检索者【简单贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],sum,sum1,sum2;
int main(void)
{
int n,m; cin>>n>>m;
for(int i=1;i<=n-m;i++) cin>>a[i],sum+=a[i];
for(int i=n-m+1;i<=n;i++) sum1+=1,sum2+=5;
printf("%.5lf %.5lf\n",(sum+sum1)*1.0/n,(sum+sum2)*1.0/n);
return 0;
}
解方程【二分】
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main(void)
{
cin>>a>>b>>c;
double l=0,r=1e9;
for(int i=0;i<=1e6*5;i++)
{
double mid=(l+r)/2;
double now = pow(mid,a)+b*log(mid);
if(now<c) l = mid;
else r = mid;
}
printf("%.7lf",l);
return 0;
}
神奇的字母(二)【模拟】
#include<bits/stdc++.h>
using namespace std;
int a[35]={
0};
string s;
int main(void)
{
while(getline(cin,s))
{
for(int i=0;i<s.size();i++)
if(s[i]>='a'&&s[i]<='z') a[s[i]-'a']++;
}
int maxv=0,cnt=0;
for(int i=0;i<26;i++) if(a[i]>maxv) maxv=a[i],cnt=i;
printf("%c",cnt+'a');
return 0;
}
十字爆破
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N],b[N],n,m;
int main(void)
{
int n,m; cin>>n>>m;
vector< vector<int> > ve(n+1,vector<int>(m+1,0));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&ve[i][j]);
a[i]+=ve[i][j],b[j]+=ve[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%lld ",a[i]+b[j]-ve[i][j]);
}
puts("");
}
return 0;
}
异或和之和【思维 位运算】
、
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
const int mod=1e9+7;
LL a[N],s[65],n,sum;
LL qsm(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1) sum=sum*a%p;
b>>=1;
a=a*a%p;
}
return sum%p;
}
LL solve(LL a,LL b)
{
LL sum=1;
for(int i=a,j=1;j<=b;j++,i--) sum=(sum*i)%mod;
for(int i=b;i>=1;i--) sum=(sum*qsm(i,mod-2,mod))%mod;
return sum;
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=0;j<64;j++)
if(a[i]>>j&1) s[j]++;
for(int i=0;i<64;i++)
{
LL temp=(1ll<<i)%mod*(solve(s[i],3)%mod+solve(n-s[i],2)%mod*s[i]%mod)%mod;
sum=(sum+temp)%mod;
}
cout<<sum;
return 0;
}