20201122模拟
感觉今天的模拟还比较简单????但是考场上还是懒得动脑子吧,而且裹着大衣,头脑也比较糊涂
T1和T3考场都和正解差一点,T3想二分但是\(check\)函数并不是很有把握,而且正确性也是很迷惑
期望:60+20+?+10,实际20+20+40+40,改后100+20+100+40
T1
solution
构造题,根据一系列的举例子,可以发现只有\(b\leq a-2\)的时候才有解,且\(b=a-3\)的时候无解
先考虑\(b =a-2\)的情况,形状类似一个二叉树,并且根多连了一个点
再考虑\(b\leq a-4\)的情况,和上一种情况差不多,相当于一个二叉树,但是度为1的点比较多,所以余出一个点,在他上面连边凑数
注意!!特判\(a=b=1\)的情况,输出1,就离谱
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int read(){
int x = 1,a = 0;char ch = getchar();
while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
return x*a;
}
int a,b;
int main(){
a = read(),b = read();
if (b == a-2){
if (b){
printf("%d\n",a+b);
printf("%d %d\n",1,2);
printf("%d %d\n",1,3);
printf("%d %d\n",1,4);
int root = 4;
for (int i = 5;i <= a+b;i++){
printf("%d %d\n",root,i);
if (i-root == 2) root = i;
}
}
else printf("2\n1 2\n");
}
else if (b <= a-4){
printf("%d\n",a+b+1);
printf("1 2\n");
int root = 2;
for (int i = 3;i <= 2*b+2;){
for (int j = 1;j <= 2;j++,i++) printf("%d %d\n",root,i);
root += 2;
}
for (int i = 2*b+3;i <= a+b+1;i++){
printf("%d %d\n",1,i);
}
}
else{
if(a==0&&b==0) puts("1");
else puts("0");
}
return 0;
}
T2
solution
\(n=0\)直接输出答案
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int read(){
int x = 1,a = 0;char ch = getchar();
while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
return x*a;
}
int t;
double ans;
int main(){
freopen("roll.in","r",stdin);
freopen("roll.out","w",stdout);
t = read();
while (t--){
int n = read(),u = read(),k = read();
if (n == 0) ans = u*k*1.0;
printf("%.10lf\n",ans);
}
return 0;
}
T3
solution
上来看题就想到了二分,直接上,哎?直接\(O(m)\)dfs不香么,开始直接dfs……
哎??怎么有点不对的样子,怎么又有点对的样子,算了,就这样把,回过头再看,好像还是二分把,开始混乱,直接交吧,不改了
思路还是挺明显的,二分最终的疲惫值,看是否能得到一个合法路径
单调性显然能满足大的就一定能满足更大的,不满足小的肯定满足不了更小的。不过我写的玄学代码还过了40
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
int read(){
int x = 1,a = 0;char ch = getchar();
while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
return x*a;
}
const int maxn = 1e6+10;
int n,m;
struct node{
int to,nxt,w;
}ed[maxn];
int head[maxn],tot;
void add(int u,int to,int w){
ed[++tot].to = to;
ed[tot].w = w;
ed[tot].nxt = head[u];
head[u] = tot;
}
bool vis[maxn];
int dis[maxn];
bool check(int s){
queue<int> q;q.push(1);
memset(vis,0,sizeof(vis));vis[1] = 1;memset(dis,0,sizeof(dis));
while (!q.empty()){
int x = q.front();q.pop();
for (int i = head[x];i;i = ed[i].nxt){
int to = ed[i].to;
if(vis[to]) continue;
dis[to] = dis[x]+1;
if (dis[to]*ed[i].w > s) continue;
vis[to] = 1;
q.push(to);
}
}
return vis[n];
}
signed main(){
n = read(),m = read();
for (int i = 1;i <= m;i++){
int a = read(),b = read(),c = read();
add(a,b,c);
}
int l = 0,r = 3e14+10;
while (l < r){
int mid = (l+r)>>1;
if (check(mid)) r = mid;
else l = mid+1;
}
printf("%lld\n",r);
return 0;
}
T4
solution
并不知道自己写的什么奇奇怪怪的东西,复杂度好像是\(O(n^2)\)的,但是过了1e7就离谱
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
int read(){
int x = 1,a = 0;char ch = getchar();
while (ch < '0'||ch > '9'){if (ch == '-') x = -1;ch = getchar();}
while (ch >= '0'&&ch <= '9'){a = a*10+ch-'0';ch = getchar();}
return x*a;
}
int l,r,ans;
signed main(){
freopen("triad.in","r",stdin);
freopen("triad.out","w",stdout);
l = read(),r = read();
for (int i = l;i <= r;i++){
int res = r/i;
for (int j = 2;j <= res;j++){
ans += res/j-1;
}
}
printf("%lld\n",ans);
}