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
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7526835.html