1. 程式人生 > >10.12NOIP模擬題(1)

10.12NOIP模擬題(1)

sizeof mem 發現 坐標 沒有 pre names c11 alt

技術分享圖片

技術分享圖片

技術分享圖片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

#define N 2001

using namespace std;
int n,m,ans,cnt;
int vis[N],w[N],x[N],deep[N];
int e[N][N];
queue<int>q;

inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c>
9||c<0){if(c==-)f=-1;c=getchar();} while(c>=0&&c<=9){x=x*10+c-0;c=getchar();} return x*f; } void bfs(int now) { while(!q.empty()) q.pop(); memset(vis,0,sizeof vis); memset(deep,0,sizeof deep); q.push(now); while(!q.empty()) {
int u=q.front();q.pop(); ans=max(ans,deep[u]+1); for(int i=1;i<=n;i++) { if(u==now&&e[i][now]) { deep[i]=deep[now]+1; q.push(i); } else if(deep[i]==deep[u] && e[u][i]) { deep[i]
=deep[u]+1; q.push(i); } } } } int main() { freopen("clique.in","r",stdin); freopen("clique.out","w",stdout); int tmp; n=read(); for(int i=1;i<=n;i++) x[i]=read(),w[i]=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) continue; tmp=x[i]-x[j]; if(tmp<0) tmp=-tmp; if(tmp>=w[i]+w[j]) e[i][j]=e[j][i]=1; } for(int i=1;i<=n;i++) bfs(i); printf("%d\n",ans); return 0; }
20暴力23333
/*
將點(xi,wi)看成區間(xi-wi,xi+wi),絕對值去掉移項
那麽兩個點有連邊當且僅當兩個區間沒有公共點
最多的不重合的區間數就是最大團的點數
刪去所有包含其它區間的區間,在剩下的區間中每次貪心取一個能取的坐標最小的區間。
*/
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=200004;
int n;
struct zhw{
    int l,r;
    friend bool operator <(zhw a,zhw b)
    {
        return  a.r<b.r||(a.r==b.r&&a.l>b.l);
    }
}a[maxn];
int x,w,l,r;
int main()
{
    freopen("clique.in","r",stdin);
    freopen("clique.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&x,&w);
        a[i].l=x-w,a[i].r=x+w;
    }
    sort(a+1,a+n+1);
    int pos=a[1].r,ans=1;
    for(int i=1;i<=n;++i)
    {
        if(a[i].l>=pos)ans++,pos=a[i].r;
    }
    printf("%d",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

技術分享圖片

/*
可以對硬幣的編號取模k,這樣就分成了k組
每一組中,若有偶數堆硬幣那這一組硬幣可以全部拿走。
若有奇數堆硬幣那一定會有一堆剩余
而且剩余的一定是編號為奇數的那一堆(自己寫一下就能發現一定是編號為奇數的剩余)
同樣把這一組的所有硬幣價值加起來,再減去這一堆中編號為奇數,並且價值最小的那一堆即可。
*/
#include <cstdio>
#include <iostream>

#define ll long long 

using namespace std;
int n,k;
ll a[200001];

int main()
{
      freopen("coin.in","r",stdin);
      freopen("coin.out","w",stdout);
      
      scanf("%d%d",&n,&k);k--;
      for (int i=0;i<n;i++) scanf("%lld",&a[i]);
      
      ll ret=0;
    for (int i=0;i<=k;i++)
    {
        ll mini=1e9,tot=0;
          for (int j=i;j<n;j+=k+1)
        {
              tot^=1;
            if (tot) mini=min(mini,a[j]);
            ret+=a[j];
          }
          ret-=tot*mini;
    }
    cout<<ret;
}

技術分享圖片

技術分享圖片

/*
水水的dp 
*/
#include<iostream>
#include<cstring>
#include<cstdio>

#define N 1007

using namespace std;
int n,t;
int v[N],sum[N];
int f[N];

int main()
{
    freopen("cherry.in","r",stdin);
    freopen("cherry.out","w",stdout);
    scanf("%d%d",&n,&t);
    for(int i=1;i<=n;++i)
    scanf("%d",&v[i]),sum[i]=sum[i-1]+v[i];
    memset(f,127/3,sizeof(f));
    f[0]=0;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=i;j++)
            f[i]=min(f[i],f[j-1]+(sum[i]-sum[j-1]-t)*(sum[i]-sum[j-1]-t));
    printf("%d",f[n]);
    return 0;        
}

10.12NOIP模擬題(1)