#include "bits/stdc++.h" using namespace std; typedef long long LL; LL A,B,C,X,Y,Z; int main() { cin>>A>>B>>C>>X>>Y>>Z; cout<<min(A,Y)+min(B,Z)+min(C,X)<<endl; return 0; }
#include "bits/stdc++.h" using namespace std; string s; int n; int main() { cin>>n; cin>>s; int x=0,y=0; for(auto ch:s){ if(ch=='6') x++; if(ch=='1') y++; } cout<<min(x-1,y)<<endl; }
分析:代表前i道题做对j道的概率,显然我们可以得到
#include "bits/stdc++.h" using namespace std; const int maxn=2000+10; typedef long long LL; const LL mod=1e9+7; int n; LL p[maxn],dp[maxn][maxn]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&p[i]); dp[0][0]=1; for(int i=1;i<=n;i++){ dp[i][0]=dp[i-1][0]*(1-p[i]+mod)%mod; for(int j=1;j<=i;j++){ dp[i][j]=((dp[i-1][j]*(1-p[i]+mod)%mod)+(dp[i-1][j-1]*p[i]%mod))%mod; } } for(int i=0;i<=n;i++) printf("%lld ",dp[n][i]); printf("\n"); return 0; }
分析:首先三点不共线,然后
#include "bits/stdc++.h" using namespace std; const int maxn=500+10; const double eps=1e-9; int n; struct node{ double x,y; }p[maxn]; double dp[maxn][maxn]; double v[5]; void init(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) dp[i][j]=((p[i].x-p[j].x)*(p[i].x-p[j].x))+((p[i].y-p[j].y)*(p[i].y-p[j].y)); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); if(n<3){ printf("0\n"); return 0; } init(); int cnt=0; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ for(int k=j+1;k<=n;k++){ if((p[i].y-p[k].y)*(p[i].x-p[j].x)-((p[i].x-p[k].x)*(p[i].y-p[j].y))==0) continue; v[0]=dp[i][j]; v[1]=dp[i][k]; v[2]=dp[j][k]; sort(v,v+3); if(v[0]+v[1]<v[2]) cnt++; } } } printf("%d\n",cnt); return 0; }
分析:化成,所以只需要
为完全平方数,所以就是统计不超过n的所有完全平方数的所有因子数
#include "bits/stdc++.h" using namespace std; typedef long long LL; LL n; int main() { scanf("%lld",&n); LL cnt=0; for(LL i=1;i*i<=n;i++){ LL tmp=i*i; for(LL j=1;j*j<=tmp;j++){ if(tmp%j==0){ if(j*j==tmp) cnt++; else cnt+=2; } } } printf("%lld\n",cnt); return 0; }
分析:牛牛选取一个增加,相当于牛可乐消耗一个,失去
,所以我们按照
进行贪心即可
#include "bits/stdc++.h" using namespace std; const int maxn=2e5+100; int n; struct node{ int a,b,id,sum; }p[maxn]; bool cmp(node x,node y){ return x.sum>y.sum; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&p[i].a); for(int i=1;i<=n;i++){ scanf("%d",&p[i].b); p[i].id=i; p[i].sum=p[i].a+p[i].b; } sort(p+1,p+1+n,cmp); for(int i=1;i<=n;i++){ if(i%2) printf("%d ",p[i].id); } printf("\n"); for(int i=1;i<=n;i++){ if(i%2==0) printf("%d ",p[i].id); } printf("\n"); return 0; }
#include<bits/stdc++.h> using namespace std; typedef long long LL; const LL mod=1e9+8; int T; LL a,b,c,d,e,f,g; LL quickmod(LL x,LL y){ LL res=1; while(y){ if(y&1) res=res*x%mod; x=x*x%mod; y>>=1; } return res; } int main() { cin>>T; while(T--){ cin>>a>>b>>c>>d>>e>>f>>g; g%=mod; if(((quickmod(a,d)+quickmod(b,e))%mod+quickmod(c,f))%mod==g){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } } return 0; }
分析:对于当前位置i,有种决策,一种是作为前一段的尾,即,还有一种是新起一段
,二者取最小值就好了,注意从1到K开始往后枚举时,只能作为前一段的尾。
#include "bits/stdc++.h" using namespace std; const int maxn=3e5+100; typedef long long LL; int n,k; LL a[maxn],dp[maxn]; int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); sort(a+1,a+1+n); for(int i=1;i<=k;i++) dp[i+k-1]=a[i+k-1]-a[1]; for(int i=2*k;i<=n;i++) dp[i]=min(dp[i-1]+a[i]-a[i-1],dp[i-k]+a[i]-a[i-k+1]); printf("%lld\n",dp[n]); return 0; }
分析:首先对点去重,得到去重之后的点数m。我们枚举最低位k,使得在其中存在使得该位为0,存在
使得该位为1。然后让所有为0的跟
连,让所有为1的跟
连
#include "bits/stdc++.h" using namespace std; int n; int main() { set<int>s; scanf("%d",&n); int v0=0,v1=pow(2,31)-1; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); v0|=x; v1&=x; s.insert(x); } int v=v0^v1; int ans=0; for(int i=0;i<=30;i++){ int tmp=1<<i; if(tmp&v){ ans=tmp*(s.size()-1); break; } } printf("%d\n",ans); return 0; }
分析:把式子化开,就得到如下形式:。于是我们可以把区间
分成两段
。于是令
,
所以
#include "bits/stdc++.h" using namespace std; typedef long long LL; const int maxn=2e5+10; const LL mod=1e9+7; int n,m; LL b[maxn],k[maxn]; struct node{ int l,r; LL k,b; }tree[maxn<<2]; void pushup(int rt){ tree[rt].k=tree[rt<<1].k*tree[rt<<1|1].k%mod; tree[rt].b=(tree[rt<<1].b*tree[rt<<1|1].k+tree[rt<<1|1].b)%mod; } void build(int l,int r,int rt){ tree[rt].l=l,tree[rt].r=r; if(l==r){ tree[rt].k=k[l]; tree[rt].b=b[l]; return; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt); } void update(int id,int rt,LL k1,LL b1){ if(tree[rt].l==tree[rt].r){ tree[rt].k=k1,tree[rt].b=b1; return; } int mid=(tree[rt].l+tree[rt].r)>>1; if(id<=mid) update(id,rt<<1,k1,b1); else update(id,rt<<1|1,k1,b1); pushup(rt); } pair<LL,LL> query(int l,int r,int rt){ if(tree[rt].l==l&&tree[rt].r==r) return make_pair(tree[rt].k,tree[rt].b); int mid=(tree[rt].l+tree[rt].r)>>1; if(r<=mid) return query(l,r,rt<<1); else if(l>mid) return query(l,r,rt<<1|1); else return make_pair(query(l,mid,rt<<1).first*query(mid+1,r,rt<<1|1).first%mod, (query(l,mid,rt<<1).second*query(mid+1,r,rt<<1|1).first+query(mid+1,r,rt<<1|1).second)%mod); } int main() { //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&k[i]); for(int i=1;i<=n;i++) scanf("%lld",&b[i]); build(1,n,1); while(m--){ int op,i,l,r; LL k1,b1; scanf("%d",&op); if(op==1){ scanf("%d%lld%lld",&i,&k1,&b1); update(i,1,k1,b1); }else{ scanf("%d%d",&l,&r); pair<LL,LL> tmp=query(l,r,1); printf("%lld\n",(tmp.first+tmp.second)%mod); } } return 0; }