• 9.15——模拟赛


    T1 太(洛谷 ——U3348 A2-回文数

    题目描述:
    残存的碎片却愈加清晰。
    好久一段时间,记忆突然停顿了,脑子一片空白。
    忘记此刻是何年何月, 甚至忘记自己是谁, 等待太久, 一切都回不到最初的原点。
    九年。
    相遇,分离,重逢,再…… 从初始到末端。
    如傻瓜般虔诚的追随在你左右。
    思路:大模拟,打表找规律
    2333 年,在银河系的某星球上,X 军*和 Y 军*正在激烈地作
    战。在战斗的某一阶段,Y 军*一共*遣了 N 个巨型机器人进攻 X
    军*的阵地,其中第 i 个巨型机器人的装甲值为 Ai。当一个巨型机器
    人的装甲值减少到 0 或者以下时,这个巨型机器人就被摧毁了。X 军
    *有 M 个激光武器, 其中第 i 个激光武器每秒可以削减一个巨型机器
    人 Bi 的装甲值。激光武器的攻击是连续的。这种激光武器非常奇怪,
    一个激光武器只能攻击一些特定的敌人。 Y 军*看到自己的巨型机器
    人被 X 军*一个一个消灭,他们急需下达更多的指令。
    输入描述:
    一行 给你一个数 n 表示下达的指令。
    输出描述:
    一行 请输出第 n 个回文数
    样例输入:
    输入样例#1:
    2333
    输出样例#1:
    1334331
    样例输出:
    输入样例#2:
    12345678987654321
    输出样例#2:
    23456789876543222234567898765432
    提示:
    对于 10%的数据 n<=100
    对于 20%的数据 n<=100000000
    对于 100%的数据 n<=1000000000000000000

    打表找规律,发现输入的n,第一位-1,最后一位+1,就是回文数的一半(注意处理进位)

    回文数长度为1的有9个,len==2的有9 的,依次 90 90 900 900 9000 9000.。。。

    可以根据n判断出回文数的长度奇偶,再判断输出的数。。。

     1 #include <cstring>
     2 #include <cstdio>
     3 
     4 #define LL long long
     5 
     6 LL a,len;
     7 int beg=1,cnt,num[50];
     8 
     9 inline void Pre()
    10 {
    11     LL tot=9,tmp=9;    len=1;
    12     for(int i=1; tot<=a; ++len,++i)
    13         if(i==2) i=0,tmp*=10,tot+=tmp;
    14         else tot+=tmp;
    15     for(; a; a/=10)
    16         num[++cnt]=a%10;
    17     num[beg]++; num[cnt]--;
    18     for(int i=1; num[i]==10; )
    19         num[i++]=0,num[i]++;
    20     for(; !num[cnt]; --cnt)
    21         if(!num[cnt-1]) num[cnt-1]=9;
    22 }
    23 
    24 int Presist()
    25 {
    26 //    freopen("hwc.in","r",stdin);
    27 //    freopen("hwc.out","w",stdout);
    28     scanf("%lld",&a);    Pre();
    29     if(len&1)
    30     {
    31         for(int i=cnt; i; --i) printf("%d",num[i]);
    32         for(int i=2; i<=cnt; ++i) printf("%d",num[i]);
    33     }
    34     else
    35     {
    36         for(int i=cnt; i; --i) printf("%d",num[i]);
    37         for(int i=1; i<=cnt; ++i) printf("%d",num[i]);
    38     }
    39     return 0;
    40 }
    41 
    42 int Aptal=Presist();
    43 int main(){;}
    AC

    T2 妃 (洛谷——P2905 [USACO08OPEN]农场危机Crisis on the Farm

    题目描述:
    回忆的章节错乱不堪,想要收拾那些画面用来重温,却显得七零八乱。
    整个人是麻木的,记忆也跟着苍白。
    曾留下太多太深的足迹在心里。
    刻意隐瞒,隐藏,隐忍着……
    用近乎笨拙的方式隐身荒芜的背后,一直在原地徘徊。
    决绝的用极端的方式否定了一切的伤痕和不舍, 清楚的听见自己心碎的声音。
    一次次对灵魂华丽的自残,壮观而且荒谬。
    我想我还是做错了,一味强求,不想离开你。
    众所周知,三校区有一项优雅的大课间活动——广场舞。广
    场舞在以前是十分好跳的,同学们只要随着音乐翩翩起舞即可。但是
    三区校长为了增加广场舞的趣味性和可观性, 勒令同学们摞成一摞跳
    操。同学们碍于各班班长的淫威只得同意了,同学们在跳操时是这样
    纸的,30 个人摞成一摞(因为学校人数太少了,(*^__^*) ),摞成了
    n 摞:
    校长会偷偷的窝在小黑屋里,放各种颜色的烟花来指挥跳舞。
    校长最多可以燃放 30 个烟花,烟花有四种颜色,分别可以指挥所有
    的同学向东,西,南,北各移动一个格。但是这样跳操太累了,同学
    们都想偷懒,当一摞同学最下面的同学移动到教学楼时,这摞同学最
    上面的学生会跳到教学楼顶层,如下图:
    思路:恶心的动归具体见代码。
    同学们想要尽可能多的偷懒,于是找到了你,总校后勤烟花
    爆竹管制处处长。
    因为校长的烟花都是由你提供的,而校长只会按照你提供的
    烟花的顺序去燃放烟花,请你给出最多可以有几名同学偷懒,和此时
    燃放烟花的顺序。顺序用 E,W,S,N 表示指挥东西南北各种不同颜色
    的烟花。若有多个相同的,输出字典序最小的。
    输入描述:
    第 1 行 3 个整数 n,m,k,描述同学摞成了几摞,教学楼的个
    数,校长可燃放的烟花的个数。
    第 2 到 1+n 行每行两个整数 x,y,描述 n 摞同学开始时的坐
    标。
    第 n+2 到 n+m+1 行每行两个整数 x,y,描述 m 个教学楼的坐
    标。
    输出描述:
    两行。
    第一行 :最多能偷懒的学生的个数。
    第二行 :此时燃放烟花的方案。
    样例输入:
    3 6 3
    3 4
    6 2
    5 7
    8 2
    9 2
    6 4
    5 4
    6 7
    8 7
    样例输出:
    6
    EEE
    提示:
    10%的数据,n<=1000,m<=1000,k<=5
    40%的数据,n<=1000,m<=1000,k<=10
    70%的数据,n<=1000;m<=1000;k<=20
    100%的数据,n<=1000,m<=1000,k<=30,0<=x<=10000,0<=y<=10000

     f[k][i][j]表示走k步,到(i,j)的最大价值,

    加31预防出现负坐标

     1 #include <cstdlib>
     2 #include <cstdio>
     3 
     4 const int N(1005);
     5 inline void read(int &x)
     6 {
     7     x=0; register char ch=getchar();
     8     for(; ch>'9'||ch<'0'; ) ch=getchar();
     9     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    10 }
    11 
    12 int n,m,k,ans;
    13 int fx[4]={1,0,0,-1};
    14 int fy[4]={0,1,-1,0};
    15 int f[35][65][65],get[65][65];
    16 
    17 char step[35][65][65];
    18 char ch[4]={'W','S','N','E'};
    19 
    20 struct life {
    21     int x,y;
    22 }cow[N],grass[N];
    23 
    24 #define max(a,b) (a>b ?a :b)
    25 
    26 int Presist()
    27 {
    28     read(n),read(m),read(k);
    29     for(int i=1; i<=n; ++i)
    30         read(cow[i].x),read(cow[i].y);
    31     for(int i=1; i<=m; ++i)
    32         read(grass[i].x),read(grass[i].y);
    33     for(int i=1; i<=n; ++i)
    34         for(int j=1; j<=m; ++j)
    35         {
    36             int dx=cow[i].x-grass[j].x;
    37             int dy=cow[i].y-grass[j].y;
    38             if(abs(dx)+abs(dy)<=30) get[dx+31][dy+31]++;
    39         }
    40     for(int t=0; t<=k; ++t)
    41       for(int i=0; i<=62; ++i)
    42         for(int j=0; j<=62; ++j)
    43         {
    44             f[t][i][j]=-0x3f3f3f3f;
    45             step[t][i][j]='Z';
    46         }
    47     f[0][31][31]=get[31][31];
    48     for(int t=1; t<=k; ++t)
    49       for(int i=1; i<=62; ++i)
    50           for(int j=1; j<=62; ++j)
    51             f[t][i][j]=get[i][j]+max(max(f[t-1][i+1][j],f[t-1][i][j-1]),
    52                                    max(f[t-1][i-1][j],f[t-1][i][j+1]));
    53     for(int i=1; i<=62; ++i)
    54       for(int j=1; j<=62; ++j)
    55         ans=max(ans,f[k][i][j]);
    56     printf("%d
    ",ans);
    57     for(int i=1; i<=62; ++i)
    58       for(int j=1; j<=62; ++j)
    59           if(ans==f[k][i][j]) step[k][i][j]='A';
    60     for(int t=k-1; t>=0; t--)
    61       for(int i=1; i<=61; ++i)
    62           for(int j=1; j<=61; ++j)
    63             for(int h=0; h<4; ++h)
    64             {
    65                 int xx=i+fx[h],yy=j+fy[h];
    66                 if(f[t][i][j]+get[xx][yy]==f[t+1][xx][yy]&&step[t+1][xx][yy]<'Z')
    67                     step[t][i][j]=ch[h];
    68           }
    69     for(int x=31,y=31,t=0; t<k; ++t)
    70     {
    71         printf("%c",step[t][x][y]);
    72         if(step[t][x][y]=='N') y--;
    73         else if(step[t][x][y]=='S') y++;
    74         else if(step[t][x][y]=='W') x++;
    75         else if(step[t][x][y]=='E') x--;
    76     }
    77     return 0;
    78 }
    79 
    80 int Aptal=Presist();
    81 int main(){;}
    AC

    T3 糖  (洛谷——P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    题目描述:
    还是忘不了。
    关于你的好与不好。
    分分合合,早已成为习惯。
    偏执的如同我的性格般执拗。
    什么事都不做,安静的蜷缩在被窝里,细数自己的心碎与莫落。
    最初的最初。
    最后的最后。
    Xxy 每天都奋斗在跳楼梯的第一线, 所以回宿舍后感到又累又
    饿,很快陷入了梦乡。在梦中,xxy 进入了一个巨大的城堡。
    这个题从叶子节点去算的话显然很困难,所以我们可以从 xx
    所在的两个点开始倒着搞。 min 和 man 记录每个节点最多和最少有
    多少个糖果才能让 xx 恰好吃到 k 只。然后,分别以这两个点为根节
    点,深搜一下求出所有的 min 和 man。
    接着,二分答案,求一下对于每个节点,g 群糖果中符合条件的糖果
    的群数。最后,群数*k 即为所求。
    Xxy 惊讶的发现,这座城堡有 n 个房间和 m 条走廊,走廊非常
    窄,只能单向通行。Xxy 惊讶的发现在每个房间里都有一个魔法阵,
    魔法阵可以召唤魔法糖果,每个房间有且只有一个魔法糖果。每个魔
    法糖果都有一个饱腹值, xxy 吃下糖果,就会增加饱腹值,不那么饿。
    与吃糖果相反的是,xxy 需要穿越走廊才能吃到糖果,而每个走廊又
    有一定的疲惫值。Xxy 想在吃完糖果后返回出发点。
    Xxy 现在非常的饥饿, 所以她想吃到尽量多的糖果。 但是, xxy
    也非常的累,所以她不想去浪费时间走更多的路。所以 xxy 希望在平
    均单位时间里,获得的饱腹值尽可能的大。请问 xxy 能得到的最大平
    均饱腹值是几?(因为 xxy 太饿了,所以他至少要吃掉 2 颗糖果)
    输入描述:
    第一行:输入 n,m,分别表示城堡中房间的数量,和走廊的
    数量。
    第二行:输入 n 个数 f,表示从 1 到 n 号房间内,每个房间里
    糖果能提供的饱腹值。
    接下来 m 行,每行输入三个数 x,y,z,表示房间 x 与 y 之间
    有走廊相连通。走完这条走廊的疲惫之为 z。
    输出描述:
    一行,一个数 ans 表示 xxy 能得到的最大平均饱腹值,结果
    保留两位小数。
    样例输入:
    5 7
    30
    10
    10
    5
    10
    1 2 3
    2 3 2
    3 4 5
    3 5 2
    4 5 5
    5 1 3
    5 2 2
    样例输出:
    6.00
    提示:
    对于 100%数据:2≤n≤1000, 2≤m≤5000, 1≤x,y≤n,1≤f,z≤1000。

    设奶牛经过val[1],val[2],val[3],val[4](点1 2 3 4),遍w[1],w[2],w[3],w[4](1->2,w1,,,,2->3,w2......3->4,w3.....4->1,w4)

    二分一个ans,则ans=(val[1]+val[2]+val[3]+val[4]) / (w[1]+w[2]+w[3]+w[4])---->>>

          0=ans*w[1]-val[2]+ans*w[2]-val[3]+ans*w[3]-val[4]+ans*w[4]-val[1]

    可以以ans*边权-(连出)点权作为最短路的边,判断是否存在负环验证ans是否最优

    DFS判负环比BFS快得多

      1 #include <cstring>
      2 #include <cstdio>
      3 #include <queue>
      4 
      5 const int INF(0x3f3f3f3f);
      6 const int N(12001+5);
      7 const int M(10626+5);
      8 inline void read(int &x)
      9 {
     10     x=0; register char ch=getchar();
     11     for(; ch>'9'||ch<'0'; ) ch=getchar();
     12     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     13 }
     14 
     15 int n,m,val[N];
     16 int head[N],had[N],sum,sumedge;
     17 struct Edge {
     18     int v,next;
     19     double w;
     20     Edge(int v=0,int next=0,double w=0.0):v(v),next(next),w(w){}
     21 }edge[M],e[M];
     22 inline void ins(int u,int v,double w)
     23 {
     24     edge[++sumedge]=Edge(v,head[u],w);
     25     head[u]=sumedge;
     26 }
     27 inline void insert(int u,int v,double w)
     28 {
     29     e[++sum]=Edge(v,had[u],w); had[u]=sum;
     30 }
     31 /*
     32 int cnt[N];
     33 bool inq[N];
     34 double dis[N];
     35 
     36 bool SPFA(int s)
     37 {
     38     std::queue<int>que;
     39     memset(cnt,0,sizeof(cnt));
     40     memset(inq,0,sizeof(inq));
     41     memset(dis,127/3,sizeof(dis));
     42     que.push(s); dis[s]=0; cnt[s]++;
     43     for(int u,v; !que.empty(); )
     44     {
     45         u=que.front(); que.pop(); inq[u]=0;
     46         for(int i=head[u]; i; i=edge[i].next)
     47         {
     48             v=edge[i].v;
     49             if(dis[v]>dis[u]+edge[i].w)
     50             {
     51                 dis[v]=dis[u]+edge[i].w;
     52                 if(!inq[v])
     53                 {
     54                     inq[v]=1,que.push(v);
     55                     if(++cnt[v]>n) return 1;
     56                 }
     57             }
     58         }
     59     }
     60     return 0;
     61 }
     62 */
     63 bool vis[N];
     64 double dis[N];
     65 bool SPFA(int u)
     66 {
     67     vis[u]=1;
     68     for(int v,i=head[u]; i; i=edge[i].next)
     69     {
     70         v=edge[i].v;
     71         if(dis[v]>dis[u]+edge[i].w)
     72         {
     73             dis[v]=dis[u]+edge[i].w;
     74             if(vis[v] || SPFA(v))
     75             {
     76                 vis[v]=1;
     77                 return 1;
     78             }
     79         }
     80     }
     81     vis[u]=0;
     82     return 0;
     83 }
     84 
     85 double ans,l,r,mid;
     86 bool check(double x)
     87 {
     88     memset(edge,0,sizeof(edge));
     89     memset(head,0,sizeof(head));
     90     sumedge=0;
     91     for(int v,u=1; u<=n; ++u)
     92       for(int i=had[u]; i; i=e[i].next)
     93       {
     94           v=e[i].v;
     95         ins(u,v,(double)(x*e[i].w-val[v]));
     96       }
     97     memset(dis,127/3,sizeof(dis));
     98     memset(vis,0,sizeof(vis));
     99     for(int i=1; i<=n; ++i)
    100         if(SPFA(i)) return 1;
    101     return 0;
    102 }
    103 
    104 int Presist()
    105 {
    106 //    freopen("sugar.in","r",stdin);
    107 //    freopen("sugra.out","w",stdout);
    108     
    109     read(n),read(m);
    110     for(int i=1; i<=n; ++i) read(val[i]),r+=val[i];
    111     for(int u,v,w,i=1; i<=m; ++i)
    112         read(u),read(v),read(w),insert(u,v,w);
    113     for(l=0.0,r*=1.0; l+0.00001<r; )
    114     {
    115         mid=(l+r)/2.0;
    116         if(check(mid))
    117         {
    118             ans=mid;
    119             l=mid;
    120         }
    121         else r=mid;
    122     }
    123     printf("%.2lf",ans);
    124     return 0;
    125 }
    126 
    127 int Aptal=Presist();
    128 int main(){;}
    洛谷评测 DFS 16ms,BFS 960,考试BFS被卡7个点,DFS快速AC
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    Intent属性详解
    LIBGDX游戏引擎平台介绍与搭建
    android教程之intent对象
    android教程之日期时间控件DatePicker/TimePicker
    DotNet Core 3.1 EF Core 数据库迁移(Migration)
    微服务介绍
    Asp.Net Core 认证授权:Cookie-based
    IdentityServer4 实现自定义 GrantType 授权模式
    SqlServer配置主从复制
    在【Stimulsoft-Reports-Net-2016.1】中使用DataSet做数据源新建报表
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7526835.html
Copyright © 2020-2023  润新知