zoukankan      html  css  js  c++  java
  • nenu contest3 The 5th Zhejiang Provincial Collegiate Programming Contest

    ZOJ Problem Set - 2965 Accurately Say "CocaCola"!  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2965

     打表。求含有7或者是7的倍数的数。题目输入p,输出第一个连续出现p个满足条件的头。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define mt(a,b) memset(a,b,sizeof(a))
     5 using namespace std;
     6 const int M=1024;
     7 bool vis[M];
     8 bool isgood(int x){
     9     while(x){
    10         if(x%10==7) return true;
    11         x/=10;
    12     }
    13     return false;
    14 }
    15 int ans[M];
    16 int main(){
    17     mt(vis,0);
    18     for(int i=1;i<M;i++){
    19         if(isgood(i)||!(i%7)){
    20             vis[i]=true;
    21         }
    22     }
    23     for(int i=1;i<=99;i++){
    24         ans[i]=M;
    25     }
    26     int s=1,t=1;
    27     for(int i=1;i<M;i++){
    28         if(!vis[i]){
    29             s=t=i;
    30         }
    31         else{
    32             t++;
    33             ans[t-s]=min(ans[t-s],s+1);
    34         }
    35     }
    36     int n;
    37     scanf("%d",&t);
    38     while(t--){
    39         scanf("%d",&n);
    40         printf("%d
    ",ans[n]);
    41     }
    42     return 0;
    43 }
    View Code

    ZOJ Problem Set - 2966 Build The Electric System  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2966

    最小生成树 prim

     1 #include<cstdio>
     2 const int inf=0x3f3f3f3f;
     3 class Prim { ///最小生成树(无向图)o(MV^2)要保证图连通
     4     typedef int typec;///边权的类型
     5     static const int MV=512;///点的个数
     6     int n,i,j,k,pre[MV];///pre[]返回树的构造,用父结点表示,根节点(第一个)pre值为-1
     7     bool vis[MV];
     8     typec mat[MV][MV],dist[MV],res;
     9 public:
    10     void init(int tn) { ///传入点数,点下标0开始
    11         n=tn;
    12         for(i=0; i<n; i++)
    13             for(j=0; j<n; j++)
    14                 mat[i][j]=i==j?0:inf;///不相邻点边权inf
    15     }
    16     void add(int u,int v,typec w) {
    17         if(mat[u][v]>w) {
    18             mat[u][v]=w;
    19             mat[v][u]=w;
    20         }
    21     }
    22     typec solve() { ///返回最小生成树的长度
    23         for(res=i=0; i<n; i++) {
    24             dist[i]=inf;
    25             vis[i]=false;
    26             pre[i]=-1;
    27         }
    28         for(dist[j=0]=0; j<n; j++) {
    29             for(k=-1,i=0; i<n; i++) {
    30                 if(!vis[i]&&(k==-1||dist[i]<dist[k])) {
    31                     k=i;
    32                 }
    33             }
    34             for(vis[k]=true,res+=dist[k],i=0; i<n; i++) {
    35                 if(!vis[i]&&mat[k][i]<dist[i]) {
    36                     dist[i]=mat[pre[i]=k][i];
    37                 }
    38             }
    39         }
    40         return res;
    41     }
    42 }gx;
    43 int main(){
    44     int t,n,m,u,v,w;
    45     scanf("%d",&t);
    46     while(t--){
    47         scanf("%d%d",&n,&m);
    48         gx.init(n);
    49         while(m--){
    50             scanf("%d%d%d",&u,&v,&w);
    51             gx.add(u,v,w);
    52         }
    53         printf("%d
    ",gx.solve());
    54     }
    55     return 0;
    56 }
    View Code

     Kruskal

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define mt(a,b) memset(a,b,sizeof(a))
     5 using namespace std;
     6 const int inf=0x3f3f3f3f;
     7 class Kruskal { ///最小生成树(无向图)o(ME*logME)
     8     typedef int typec;///边权的类型
     9     static const int ME=512*512;///边的个数
    10     static const int MV=512;///点的个数
    11     class UnionFindSet { ///并查集
    12         int par[MV];
    13     public:
    14         void init() {
    15             mt(par,-1);
    16         }
    17         int getroot(int x) {
    18             int i=x,j=x,temp;
    19             while(par[i]>=0) i=par[i];
    20             while(j!=i) {
    21                 temp=par[j];
    22                 par[j]=i;
    23                 j=temp;
    24             }
    25             return i;
    26         }
    27         bool unite(int x,int y) {
    28             int p=getroot(x);
    29             int q=getroot(y);
    30             if(p==q)return false;
    31             if(par[p]>par[q]) {
    32                 par[q]+=par[p];
    33                 par[p]=q;
    34             } else {
    35                 par[p]+=par[q];
    36                 par[q]=p;
    37             }
    38             return true;
    39         }
    40     } f;
    41     struct E {
    42         int u,v;
    43         typec w;
    44         friend bool operator < (E a,E b) {
    45             return a.w<b.w;
    46         }
    47     } e[ME];
    48     int le,num,n;
    49     typec res;
    50 public:
    51     void init(int tn){///传入点的个数
    52         n=tn;
    53         le=res=0;
    54         f.init();
    55         num=1;
    56     }
    57     void add(int u,int v,typec w) {
    58         e[le].u=u;
    59         e[le].v=v;
    60         e[le].w=w;
    61         le++;
    62     }
    63     typec solve(){///返回-1不连通
    64         sort(e,e+le);
    65         for(int i=0; i<le&&num<n; i++) {
    66             if(f.unite(e[i].u,e[i].v)) {
    67                 num++;
    68                 res+=e[i].w;
    69             }
    70         }
    71         if(num<n) res=-1;
    72         return res;
    73     }
    74 }gx;
    75 int main(){
    76     int t,n,m,u,v,w;
    77     scanf("%d",&t);
    78     while(t--){
    79         scanf("%d%d",&n,&m);
    80         gx.init(n);
    81         while(m--){
    82             scanf("%d%d%d",&u,&v,&w);
    83             gx.add(u,v,w);
    84         }
    85         printf("%d
    ",gx.solve());
    86     }
    87     return 0;
    88 }
    View Code

    ZOJ Problem Set - 2969 Easy Task http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1968

    给式子的系数,求导完输出系数,如果全为零输出零,否则从第一个不为零的开始输出。

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int M=128;
     5 int a[M];
     6 int main(){
     7     int t,n;
     8     scanf("%d",&t);
     9     while(t--){
    10         scanf("%d",&n);
    11         for(int i=n;i>=0;i--){
    12             scanf("%d",&a[i]);
    13         }
    14         int id=-1;
    15         for(int i=n;i>=1;i--){
    16             a[i]*=i;
    17             if(a[i]){
    18                 id=max(id,i);
    19             }
    20         }
    21         if(id==-1){
    22             puts("0");
    23             continue;
    24         }
    25         for(int i=id;i>=1;i--){
    26             if(i!=id) printf(" ");
    27             printf("%d",a[i]);
    28         }
    29         puts("");
    30     }
    31     return 0;
    32 }
    View Code

     ZOJ Problem Set - 2970 Faster, Higher, Stronger http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1969

    f就找最小,其他找最大。

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int inf=0x3f3f3f3f;
     5 int main(){
     6     int t,n,a;
     7     scanf("%d",&t);
     8     char op[16];
     9     while(t--){
    10         scanf("%s%d",op,&n);
    11         bool sma=false;
    12         int ans=-inf;
    13         if(op[0]=='F'){
    14             sma=true;
    15             ans=inf;
    16         }
    17         for(int i=0;i<n;i++){
    18             scanf("%d",&a);
    19             if(sma){
    20                 ans=min(ans,a);
    21             }
    22             else{
    23                 ans=max(ans,a);
    24             }
    25         }
    26         printf("%d
    ",ans);
    27     }
    28     return 0;
    29 }
    View Code

     ZOJ Problem Set - 2971 Give Me the Number http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1970

    3个3个处理,然后加起来。

     1 #include<cstdio>
     2 #include<cstring>
     3 const int M=32;
     4 char a[M*M],b[M][M];
     5 int ans[M],val[M];
     6 char gewei[M][M]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
     7 char shiwei[M][M]={"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
     8 char jishi[M][M]={"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
     9 int main(){
    10     int t;
    11     scanf("%d",&t);
    12     getchar();
    13     while(t--){
    14         gets(a);
    15         int cnt=0,lb=0;
    16         for(int i=0;a[i];i++){
    17             if(a[i]==' '){
    18                 b[cnt][lb]=0;
    19                 cnt++;
    20                 lb=0;
    21             }
    22             else{
    23                 b[cnt][lb++]=a[i];
    24             }
    25         }
    26         b[cnt][lb]=0;
    27         cnt++;
    28         for(int i=1;i<=3;i++){
    29             ans[i]=0;
    30             val[i]=1;
    31         }
    32         int sta=3;
    33         for(int i=cnt-1;i>=0;i--){
    34             if(!strcmp(b[i],"and")) continue;
    35             int now=-1;
    36             for(int j=0;j<10;j++){
    37                 if(!strcmp(b[i],gewei[j])){
    38                     now=j;
    39                     break;
    40                 }
    41             }
    42             if(now==-1){
    43                 for(int j=0;j<10;j++){
    44                     if(!strcmp(b[i],shiwei[j])){
    45                         now=j+10;
    46                         break;
    47                     }
    48                 }
    49             }
    50             if(now==-1){
    51                 for(int j=0;j<8;j++){
    52                     if(!strcmp(b[i],jishi[j])){
    53                         now=(j+2)*10;
    54                         break;
    55                     }
    56                 }
    57             }
    58             if(~now){
    59                 ans[sta]+=now*val[sta];
    60             }
    61             else{
    62                 if(!strcmp(b[i],"hundred")){
    63                     val[sta]=100;
    64                     continue;
    65                 }
    66                 if(!strcmp(b[i],"thousand")){
    67                     sta=2;
    68                     continue;
    69                 }
    70                 if(!strcmp(b[i],"million")){
    71                     sta=1;
    72                     continue;
    73                 }
    74             }
    75         }
    76         int sum=0;
    77         for(int i=1;i<=3;i++){
    78             sum*=1000;
    79             sum+=ans[i];
    80         }
    81         printf("%d
    ",sum);
    82     }
    83     return 0;
    84 }
    View Code

    ZOJ Problem Set - 2972 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1971

    dp i j 表示第 i 个位置 还剩 j 的体力 能获得的最小时间,有三种方式转移,根据题目输入来转移。用t1就要浪费f1 用t2不变, 用t3还能挣点体力,注意体力上限m

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int inf=0x3f3f3f3f;
     5 const int M=128;
     6 struct G{
     7     int T1,T2,T3,F1,F2;
     8 }sta[M];
     9 int dp[M][M];
    10 int main(){
    11     int t,n,m;
    12     scanf("%d",&t);
    13     while(t--){
    14         scanf("%d%d",&n,&m);
    15         for(int i=1;i<=n;i++){
    16             scanf("%d%d%d%d%d",&sta[i].T1,&sta[i].T2,&sta[i].T3,&sta[i].F1,&sta[i].F2);
    17         }
    18         for(int i=0;i<=n;i++){
    19             for(int j=0;j<=m;j++){
    20                 dp[i][j]=inf;
    21             }
    22         }
    23         dp[0][m]=0;
    24         for(int i=0;i<=n;i++){
    25             for(int j=0;j<=m;j++){
    26                 if(j>=sta[i+1].F1){
    27                     dp[i+1][j-sta[i+1].F1]=min(dp[i+1][j-sta[i+1].F1],dp[i][j]+sta[i+1].T1);
    28                 }
    29                 dp[i+1][j]=min(dp[i+1][j],dp[i][j]+sta[i+1].T2);
    30                 dp[i+1][min(m,j+sta[i+1].F2)]=min(dp[i+1][min(m,j+sta[i+1].F2)],dp[i][j]+sta[i+1].T3);
    31             }
    32         }
    33         int ans=inf;
    34         for(int j=0;j<=m;j++){
    35             ans=min(ans,dp[n][j]);
    36         }
    37         printf("%d
    ",ans);
    38     }
    39     return 0;
    40 }
    View Code

    ZOJ Problem Set - 2975  Kinds of Fuwas http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1974

    求四个角相等的矩形个数。n^3的做法。枚举两列n^2,on枚举这两列有几对一样的,然后他们可以组成C n选2 种矩形。

     1 #include<cstdio>
     2 typedef long long LL;
     3 const int M=256;
     4 char a[M][M];
     5 char cp[]={'B','J','H','Y','N'};
     6 int main(){
     7     int t,n,m;
     8     scanf("%d",&t);
     9     while(t--){
    10         scanf("%d%d",&n,&m);
    11         for(int i=0;i<n;i++){
    12             scanf("%s",a[i]);
    13         }
    14         LL ans=0;
    15         for(int k=0;k<5;k++){
    16             for(int x=0;x<m;x++){
    17                 for(int y=x+1;y<m;y++){
    18                     LL sum=0;
    19                     for(int i=0;i<n;i++){
    20                         if(cp[k]==a[i][x]&&cp[k]==a[i][y]){
    21                             sum++;
    22                         }
    23                     }
    24                     ans+=sum*(sum-1)/2;
    25                 }
    26             }
    27         }
    28         printf("%lld
    ",ans);
    29     }
    30     return 0;
    31 }
    View Code

    ZOJ Problem Set - 2976 Light Bulbs  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1975

    因为是格点,整点,所以200*200枚举点,对每个点枚举灯算总和。4*10^6*case

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<algorithm>
     4 using namespace std;
     5 const int M=128;
     6 struct point3 {
     7     double x,y,z,I;
     8 } p[M],now;
     9 double Distance(point3 p1,point3 p2) {
    10     return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z));
    11 }
    12 int main() {
    13     int t,n;
    14     scanf("%d",&t);
    15     while(t--) {
    16         scanf("%d",&n);
    17         for(int i=0;i<n;i++){
    18             scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z,&p[i].I);
    19         }
    20         double ans=0;
    21         for(int x=-100;x<=100;x++){
    22             for(int y=-100;y<=100;y++){
    23                 now.x=x;
    24                 now.y=y;
    25                 now.z=0;
    26                 double sum=0;
    27                 for(int i=0;i<n;i++){
    28                     double dist=Distance(now,p[i]);
    29                     sum+=p[i].I*p[i].z/dist/dist/dist;
    30                 }
    31                 ans=max(ans,sum);
    32             }
    33         }
    34         printf("%.2f
    ",ans);
    35     }
    36     return 0;
    37 }
    View Code

    end

  • 相关阅读:
    c++之单链表
    c++之变量的生存期及可见性
    c++之结构体-结构数组排序
    c++之递归函数
    c++之指针练习
    C++之面向对象之构造函数和拷贝构造方法,以及析构方法
    C++之命名空间
    C++之面向对象之对象的使用
    Hadoop RPC实现
    BP(商业计划书写)
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/3949936.html
Copyright © 2011-2022 走看看