1. 程式人生 > >清北刷題沖刺 10-29 a.m

清北刷題沖刺 10-29 a.m

logs math isp iostream 技術 span 9.png cst cit

遭遇

技術分享

技術分享

技術分享

技術分享
/*
    因為選的樓是個集合,與順序無關
    而且總花費=c[1]+c[2]+c[3]+|h[1]-h[2]|+|h[2]-h[3]|
    我們規定走的順序從高到低,那麽絕對值就可以去掉
    所以就可以約掉中間的
    枚舉起點終點就行了
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define maxn 51
using namespace
std; int n,t,Ans; struct node{ int c,h; bool operator < (const node b)const{ return c<b.c; } }q[maxn]; int main(){ freopen("meet.in","r",stdin);freopen("meet.out","w",stdout); // freopen("Cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("
%d",&q[i].c); for(int i=1;i<=n;i++)scanf("%d",&q[i].h); scanf("%d",&t); sort(q+1,q+n+1); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){//枚舉起點和終點 int now=t; int mx=max(q[i].h,q[j].h),mn=min(q[i].h,q[j].h); now-=abs(q[i].h-q[j].h)+q[i].c+q[j].c;
if(now<0)continue; int ans=2; for(int k=1;k<=n;k++){ if(k==i||k==j||q[k].h>mx||q[k].h<mn)continue; if(now-q[k].c<0)continue; now-=q[k].c;ans++; } Ans=max(Ans,ans); } } if(Ans==0&&q[1].c<=t)Ans=1; printf("%d",Ans); } /* 10 19076 5807 413 6068 16699 28657 21980 12842 1668 21332 15929 15552 10742 29857 14248 14255 1464 29941 4132 25874 60081 */
100分

都市

技術分享

技術分享

技術分享

技術分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mod 47680453
using namespace std;
int n,s,a[1226],q[10],q1[10],b[1226],nn;
struct node{
    int x1,x2,x3,x4,x5;
}ans[1000];

bool vis[50000000];
int has(){
    int res=1;
    for(int i=1;i<=n;i++){
        res=(res*37+q1[i])%mod;
    }
    return res;
}
void check(){
    int t=0;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            b[++t]=q[i]+q[j];
        }
    }
    sort(b+1,b+nn+1);
    for(int i=1;i<=nn;i++){
        if(b[i]!=a[i])return;
    }
    for(int i=1;i<=n;i++)q1[i]=q[i];
    sort(q1+1,q1+n+1);
    node now;now.x1=q1[1];now.x2=q1[2];now.x3=q1[3];now.x4=q1[4];now.x5=q1[5];
    int ha=has();
    if(!vis[ha]){
        vis[ha]=1;
        ans[++s]=now;
    }
}
void dfs(int pos){
    if(pos==n+1){
        check();
        return;
    }
    for(int i=10;i>=1;i--){
        q[pos]=i;
        dfs(pos+1);
    }
}
bool cmp(node u,node v){
    if(u.x1!=v.x1)return u.x1>v.x1;
    if(u.x2!=v.x2)return u.x2>v.x2;
    if(u.x3!=v.x3)return u.x3>v.x3;
    if(u.x4!=v.x4)return u.x4>v.x4;
    if(u.x5!=v.x5)return u.x5>v.x5;
}
int main(){
    freopen("city.in","r",stdin);freopen("city.out","w",stdout);
//    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);nn=n*(n-1)/2;
    for(int i=1;i<=nn;i++)scanf("%d",&a[i]);
    sort(a+1,a+nn+1);
    dfs(1);
    printf("%d\n",s);
    sort(ans+1,ans+s+1,cmp);
    for(int i=1;i<=s;i++){
        if(n==5)printf("%d %d %d %d %d\n",ans[i].x1,ans[i].x2,ans[i].x3,ans[i].x4,ans[i].x5);
        if(n==4)printf("%d %d %d %d\n",ans[i].x1,ans[i].x2,ans[i].x3,ans[i].x4);
        if(n==3)printf("%d %d %d\n",ans[i].x1,ans[i].x2,ans[i].x3);
        if(n==2)printf("%d %d\n",ans[i].x1,ans[i].x2);
        if(n==1)printf("%d\n",ans[i].x1);
    }
    return 0;
}
30分 暴力

街燈

技術分享

技術分享
#include<iostream>
#include<cstdio>
#define maxn 100010
using namespace std;
int n,m,a[maxn];
struct node{
    int l,r,p,v;
}q[maxn];
bool flag=1;
int main(){
    freopen("light.in","r",stdin);freopen("light.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].p,&q[i].v);
    }
    for(int i=1;i<=m;i++){
        int ans=0;
        for(int j=q[i].l;j<=q[i].r;j++){
            if(a[j]%q[i].p==q[i].v)ans++;
        }
        printf("%d\n",ans);
    }
}
30分 暴力

技術分享
預計得分100+30+30
實際得分100+30+30
三個題寫的都不是正解,其中T1是化簡式子之後胡鄒的一個算法
T2T3都是暴力
這次模擬賽暴力雖然打的沒什麽技巧,但是不該丟的分都沒有丟
小結

清北刷題沖刺 10-29 a.m