zoukankan      html  css  js  c++  java
  • 2019/11/02 TZOJ

    1001 ShaoLin

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=6003

    标记一下id=1的,lower_bound找到在当前q前后的能力(now=*it,ex=*(--it))

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 map<int,int> ma;
     5 set<int> se;
     6 int main()
     7 {
     8     int t;
     9     while(~scanf("%d",&t),t)
    10     {
    11         ma.clear(),se.clear();
    12         ma[1000000000]=1;
    13         se.insert(1000000000);
    14         while(t--)
    15         {
    16             int id,q;scanf("%d%d",&id,&q);
    17             ma[q]=id;
    18             set<int> ::iterator it=se.lower_bound(q);
    19             if(it==se.end())
    20                 printf("%d %d
    ",id,ma[*(--it)]);
    21             else{
    22                 if(it!=se.begin())
    23                 {
    24                     int now=*it,ex=*(--it);
    25                     if((now-q)>=(q-ex)) printf("%d %d
    ",id,ma[ex]);
    26                     else printf("%d %d
    ",id,ma[now]);
    27                 }
    28                 else printf("%d %d
    ",id,ma[*it]);
    29             }
    30             se.insert(q);
    31         }
    32     }
    33 }
    View Code

    1002 Find the Numbers

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3988

    emm暴力了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int a[105],cnt=0;
     5 int main()
     6 {
     7     int s,p,k;scanf("%d%d%d",&s,&p,&k);
     8     for(int i=1;i<=p/2;i++)
     9         if(p%i==0) a[cnt++]=i;
    10     a[cnt]=p;
    11     if(k==1) printf("%s
    ",s>=p?"YES":"NO");
    12     else if(k==2)
    13     {
    14         for(int i=0;i<=cnt;i++)
    15             for(int j=0;j<=cnt;j++)
    16                 if(a[i]*a[j]==p&&(a[i]+a[j])==s)
    17                 {
    18                     printf("YES
    ");
    19                     return 0;
    20                 }
    21         printf("NO
    ");
    22     }
    23     else if(k==3)
    24     {
    25         for(int i=0;i<=cnt;i++)
    26             for(int j=0;j<=cnt;j++)
    27                 for(int k=0;k<=cnt;k++)
    28                     if(a[i]*a[j]*a[k]==p&&(a[i]+a[j]+a[k])==s)
    29                     {
    30                         printf("YES
    ");
    31                         return 0;
    32                     }
    33         printf("NO
    ");
    34     }
    35     else if(k==4)
    36     {
    37         for(int i=0;i<=cnt;i++)
    38             for(int j=0;j<=cnt;j++)
    39                 for(int k=0;k<=cnt;k++)
    40                     for(int l=0;l<=cnt;l++)
    41                         if(a[i]*a[j]*a[k]*a[l]==p&&(a[i]+a[j]+a[k]+a[l])==s)
    42                         {
    43                             printf("YES
    ");
    44                             return 0;
    45                         }
    46         printf("NO
    ");
    47     }
    48 }
    View Code

    1003 Mobile phones

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=6017

    输入1在(x,y)点加上a,输入2是查询(x1,y1)到(x2,y2)矩阵的元素和。贴一下参考的连接https://blog.csdn.net/baymax520/article/details/81276368

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N=1025;
     5 int ma[N][N],n,m;
     6 int lowbit(int x){return x&-x;}
     7 void add(int x,int y,int num)
     8 {
     9     for(int i=x;i<=m;i+=lowbit(i))
    10         for(int j=y;j<=m;j+=lowbit(j))ma[i][j]+=num;
    11 }
    12 void query(int x1,int y1,int x2,int y2)
    13 {
    14     int ans=0;
    15     for(int i=x2;i>0;i-=lowbit(i))
    16         for(int j=y2;j>0;j-=lowbit(j))ans+=ma[i][j];
    17     for(int i=x2;i>0;i-=lowbit(i))
    18         for(int j=y1-1;j>0;j-=lowbit(j))ans-=ma[i][j];
    19     for(int i=x1-1;i>0;i-=lowbit(i))
    20         for(int j=y2;j>0;j-=lowbit(j))ans-=ma[i][j];
    21     for(int i=x1-1;i>0;i-=lowbit(i))
    22         for(int j=y1-1;j>0;j-=lowbit(j))ans+=ma[i][j];
    23     printf("%d
    ",ans);
    24 }
    25 int main()
    26 {
    27     while(~scanf("%d",&n))
    28     {
    29         if(n==0){
    30             scanf("%d",&m);
    31             memset(ma,0,sizeof(ma));
    32         }
    33         else if(n==1){
    34             int x,y,a;scanf("%d%d%d",&x,&y,&a);
    35             add(++x,++y,a);
    36         }
    37         else if(n==2){
    38             int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    39             query(++x1,++y1,++x2,++y2);
    40         }
    41         else if(n==3) break;
    42     }
    43 }
    View Code

    1004 Fair Division

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3386

    排个序,钱少的在前边,钱一样多的就按id从大到小排。每个人都付剩余sum/(n-i)的平均钱。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct p{
     5     int pay,val,id;
     6 }kk[105];
     7 bool cmp(p a,p b)
     8 {
     9     if(a.val!=b.val) return a.val<b.val;
    10     return a.id>b.id;
    11 }
    12 bool un_cmp(p a,p b)
    13 {
    14     return a.id<b.id;
    15 }
    16 int main()
    17 {
    18     int t;
    19     for(scanf("%d",&t);t;t--)
    20     {
    21         int sum,n,all=0;scanf("%d%d",&sum,&n);
    22         for(int i=0;i<n;i++)
    23         {
    24             scanf("%d",&kk[i].val);
    25             kk[i].id=i;
    26             all+=kk[i].val;
    27         }
    28         if(all<sum)
    29         {
    30             printf("IMPOSSIBLE
    ");
    31             continue;
    32         }
    33         sort(kk,kk+n,cmp);
    34         for(int i=0;i<n;i++)
    35         {
    36             kk[i].pay=min(kk[i].val,sum/(n-i));
    37             sum-=kk[i].pay;
    38         }
    39         sort(kk,kk+n,un_cmp);
    40         for(int i=0;i<n;i++) printf("%d%c",kk[i].pay,i==n-1?'
    ':' ');
    41     }
    42 }
    View Code

    1005 Anniversary party 

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=6060

    遍历一遍找到根节点,树形dp

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int dp[6005][2],t;
     5 int father[6005];
     6 int vis[6005];
     7 void solve(int node)
     8 {
     9     vis[node]=1;
    10     for(int i=1;i<=t;i++)
    11     {
    12         if(!vis[i]&&father[i]==node)
    13         {
    14             solve(i);
    15             dp[node][1]+=dp[i][0];
    16             dp[node][0]+=max(dp[i][0],dp[i][1]);
    17         }
    18     }
    19 }
    20 void init()
    21 {
    22     memset(dp,0,sizeof(dp));
    23     memset(vis,0,sizeof(vis));
    24     memset(father,0,sizeof(father));
    25 }
    26 int main()
    27 {
    28     while(~scanf("%d",&t))
    29     {
    30         init();
    31         int l,k,root;
    32         for(int i=1;i<=t;i++) scanf("%d",&dp[i][1]);
    33         while(~scanf("%d%d",&l,&k),l||k) father[l]=k;
    34         for(int i=1;i<=t;i++)
    35             if(!father[i]) root=i;
    36         solve(root);
    37         printf("%d
    ",max(dp[root][1],dp[root][0]));
    38     }
    39 }
    View Code

    1006 Twin Prime Conjecture

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=6070

    问的是n大的数里面有多少个前后素数相差2的twin素数。只有10^5,不大。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define N 100005
     5 int ans[N];
     6 int prime[N];
     7 int vis[N];
     8 const int n=100000;
     9 int  cnt=0,now=0;
    10 void init()
    11 {
    12     for(int i=2;i<=n;i++)
    13     {
    14         ans[i]=now;
    15         if(vis[i]==0)
    16         {
    17             prime[cnt]=i;
    18             if(cnt!=0&&prime[cnt]-prime[cnt-1]==2) now++;
    19             ans[i]=now;
    20             cnt++;
    21         }
    22         for(int j=0;j<cnt&&i*prime[j]<=n;j++)
    23         {
    24             vis[i*prime[j]]=true;
    25             if(i%prime[j]==0) break;
    26         }
    27     }
    28 }
    29 int main()
    30 {
    31     init();
    32     //for(int i=0;i<20;i++) printf("%d
    ",ans[i]);
    33     int n;
    34     while(~scanf("%d",&n),n>=0)
    35     {
    36         printf("%d
    ",ans[n]);
    37     }
    38 }
    View Code

    //1007跑了

    1008 Manhattan Sort

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3677

    把排序后和排序前的位置相差的和除以二

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct p{
     5     int numb,id;
     6 }a[35];
     7 bool cmp(p x,p y)
     8 {
     9     return x.numb<y.numb;
    10 }
    11 map<int,int> b;
    12 int main()
    13 {
    14     int t;scanf("%d",&t);
    15     for(int kk=1;kk<=t;kk++)
    16     {
    17         int n;scanf("%d",&n);
    18         for(int i=1;i<=n;i++) scanf("%d",&a[i].numb),a[i].id=b[a[i].numb]=i;
    19         sort(a+1,a+n+1,cmp);
    20         int ans=0;
    21         for(int i=1;i<=n;i++)
    22             ans+=abs(i-b[a[i].numb]);
    23         printf("Case #%d: %d
    ",kk,ans/2);
    24     }
    25 }
    View Code

    1009 SPF

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=2018

    割点,困了,再说。

  • 相关阅读:
    小师妹学JVM之:JDK14中JVM的性能优化
    小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
    小师妹学JVM之:GC的垃圾回收算法
    小师妹学JVM之:JVM的架构和执行过程
    小师妹学JavaIO之:用Selector来发好人卡
    小师妹学JavaIO之:NIO中那些奇怪的Buffer
    小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
    小师妹学JavaIO之:NIO中Channel的妙用
    小师妹学JavaIO之:Buffer和Buff
    小师妹学JavaIO之:文件File和路径Path
  • 原文地址:https://www.cnblogs.com/Aaaamber/p/11784437.html
Copyright © 2011-2022 走看看