清北刷题冲刺 10-31 p.m
数列
#include<iostream> #include<cstdio> using namespace std; long long a,b,ans; void f(long long x,long long y){ if(y==0)return; ans+=x/y; f(y,x%y); } int main(){ freopen("seq.in","r",stdin);freopen("seq.out","w",stdout); cin>>a>>b; ans=1; f(a,b); cout<<ans; }
车辆销售
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<ctime> #define maxn 100010 #ifdef WIN32 #define PLL "%I64d" #else #define PLL "%lld" #endif using namespace std; int n,m,num,head[maxn],mx,mn=0x7fffffff,cnt; bool vis[maxn]; struct node{ int to,pre,v; }e[200010*2]; void Insert(int from,int to,int v){ e[++num].to=to; e[num].v=v; e[num].pre=head[from]; head[from]=num; } int q[maxn],h,t; int res; bool flag=0,com[maxn]; int bfs(int limit){ h=1; while(h<=t){ int now=q[h];h++; if(com[now])continue; flag=0; for(int i=head[now];i;i=e[i].pre){ if(e[i].v<limit){ flag=1; continue; } int to=e[i].to; if(!vis[to]){ res++; vis[to]=1; q[t++]=to; } } if(flag==0)com[now]=1; } return res; } int qread(){ int i=0,j=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();} while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar(); return i*j; } int main(){ // freopen("Cola.txt","r",stdin); freopen("car.in","r",stdin);freopen("car.out","w",stdout); n=qread();m=qread(); int x,y,z; for(int i=1;i<=m;i++){ x=qread();y=qread();z=qread(); Insert(x,y,z);Insert(y,x,z); mx=max(mx,z);mn=min(mn,z); } long long ans; for(int i=1;i<=n;i++){ ans=0; memset(q,0,sizeof(q));h=t=1; memset(vis,0,sizeof(vis)); memset(com,0,sizeof(com)); q[t++]=i;vis[i]=1; res=0; int p,now; for(int j=mx+1;j>=mn-1;j--){ if(j<0)break; now=bfs(j); if(j==mx+1){p=now;continue;} ans+=1LL*(p-now)*(p-now); p=now; } printf(PLL" ",ans); } // cout<<endl<<clock(); }
取数
#include<iostream> #include<cstdio> #define maxn 1000010 using namespace std; int n,m,k,a[maxn]; long long ans=10000000000000; int qread(){ int i=0,j=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')j=-1;ch=getchar();} while(ch<='9'&&ch>='0')i=i*10+ch-'0',ch=getchar(); return i*j; } void dfs(int pos,int cnt,long long sum){ if(cnt==k){ ans=min(ans,sum); return; } if(sum>=ans)return; if(pos>=n)return; int res=0; res+=(n-pos)/m; if(res*m<n-pos)res++; if(res+cnt<k)return; if(cnt==0){ for(int i=pos+1;i<=n;i++)dfs(i,cnt+1,sum+a[i]); return; } for(int i=pos+m;i<=n;i++){ dfs(i,cnt+1,sum+a[i]); } } int main(){ freopen("number.in","r",stdin);freopen("number.out","w",stdout); // freopen("Cola.txt","r",stdin); n=qread();m=qread();k=qread(); for(int i=1;i<=n;i++)a[i]=qread(); dfs(0,0,0); cout<<ans; }
预计得分100+30+0 实际得分100+30+20 T1有一定的思维量,但是代码很好写,也很容易从辗转相减想到辗转相除。T2T3都写的暴力,T3用的dfs,写的剪枝比较多,所以得到了20分。 感觉这几天以来上午炸的概率比较大,精神状态不好,下午相对还可以。晚上要保证睡眠充足,尽量以较好的精神面貌迎接上午的考试