比赛地址
A
思路:思维规律题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
/*ll quick_mul(ll x,ll y)
{
ll ans=0;
while(y){
if(y&1)ans=(ans+x)%mod;
x=(x+x)%mod;
y>>=1;
}
return ans%mod;
}*/
int main()
{
int n;
while(~scanf("%d",&n)){
ll ans=1;
int a,b;
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
ans=ans*(a+b)%mod;
}
printf("%lld\n",ans%mod);
}
return 0;
}
B
思路:枚举和暴力
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
for(int kase=1;kase<=t;kase++){
int k;
cin>>k;
string s;
cin>>s;
ll ans=0;
for(int i=0;i+k<=s.length();i++){
ll r=1,sum=0;
for(int j=i+k-1;j>=i;j--){
if(s[j]=='1')sum+=r;
r*=2;
}
ans=max(ans,sum);
}
cout<<"Case #"<<kase<<": "<<ans<<endl;
}
return 0;
}
C
思路:dp
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll dp[N],w[N],v[N];
int main()
{
ll t;
while(~scanf("%lld",&t)){
ll l,r,temp,A;
memset(w,0,sizeof(w));
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
for(int i=0;i<3;i++)scanf("%lld%lld",&w[i],&v[i]);
scanf("%lld%lld%lld%lld",&l,&r,&temp,&A);
w[3]=l,w[4]=r;
v[3]=temp,v[4]=temp+(r-l)*A;
for(int i=0;i<5;i++){
for(int j=w[i];j<=t;j++){
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
for(ll i=l;i<=r;i++){
dp[t]=max(dp[t],dp[t-i]+temp+(i-l)*A);
}
printf("%lld\n",dp[t]);
}
return 0;
}
G 幼儿园的战争
ps:因为这题我觉得可以单独写一篇题解,所以这里只贴一下代码,题解在这里
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int root[3*N],num[3*N],id[3*N];
int cnt,ans;
void Init(int n)
{
cnt=n,ans=n;
for(int i=1;i<=3*n;i++){
root[i]=i;
num[i]=1;
id[i]=i;
}
}
int Find(int x)
{
return x==root[x]?x:Find(root[x]);
}
void Union(int x,int y)
{
x=Find(x),y=Find(y);
if(x!=y){
root[y]=x;
num[x]+=num[y];
ans--;
}
}
void del(int x)
{
int pre=Find(id[x]);
num[pre]--;
if(num[pre]==0)ans--;
cnt++;
num[cnt]=1;
root[cnt]=cnt;
id[x]=cnt;
ans++;
}
int main()
{
int t,n,m,x,y;
scanf("%d",&t);
for(int T=1;T<=t;T++){
scanf("%d%d",&n,&m);
char s[10];
Init(n);
printf("Case #%d:\n",T);
for(int i=0;i<m;i++){
scanf("%s",s);
getchar();
if(s[0]=='q'){
printf("%d\n",ans);
}else if(s[0]=='t'){
scanf("%d%d",&x,&y);
del(y);
Union(id[x],id[y]);
}else if(s[0]=='f'){
scanf("%d%d",&x,&y);
int xx=Find(id[x]),yy=Find(id[y]);
if(xx==yy)continue;
if(num[xx]>num[yy])printf("%d is winner!\n",x),Union(id[x],id[y]);
else if(num[xx]<num[yy])printf("%d is winner!\n",y),Union(id[y],id[x]);
else printf("Either is winner!\n");
}else if(s[0]=='r'){
scanf("%d",&x);
del(x);
}
}
}
return 0;
}