zoukankan      html  css  js  c++  java
  • 20201122模拟

    感觉今天的模拟还比较简单????但是考场上还是懒得动脑子吧,而且裹着大衣,头脑也比较糊涂

    T1和T3考场都和正解差一点,T3想二分但是(check)函数并不是很有把握,而且正确性也是很迷惑

    期望:60+20+?+10,实际20+20+40+40,改后100+20+100+40

    T1

    solution

    构造题,根据一系列的举例子,可以发现只有(bleq a-2)的时候才有解,且(b=a-3)的时候无解

    先考虑(b =a-2)的情况,形状类似一个二叉树,并且根多连了一个点

    再考虑(bleq 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
    ",a+b);
    			printf("%d %d
    ",1,2);
    			printf("%d %d
    ",1,3);
    			printf("%d %d
    ",1,4);
    			int root = 4;
    			for (int i = 5;i <= a+b;i++){
    				printf("%d %d
    ",root,i);
    				if (i-root == 2) root = i;
    			}
    		}
    		else printf("2
    1 2
    ");
    	}
    	else if (b <= a-4){
    		printf("%d
    ",a+b+1);
    		printf("1 2
    ");
    		int root = 2;
    		for (int i = 3;i <= 2*b+2;){
    			for (int j = 1;j <= 2;j++,i++) printf("%d %d
    ",root,i);
    			root += 2;
    		} 
    		for (int i = 2*b+3;i <= a+b+1;i++){
    			printf("%d %d
    ",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
    ",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
    ",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
    ",ans);
    }
    
  • 相关阅读:
    运营设计方法论
    使用 typescript ,提升 vue 项目的开发体验(2)
    PAT 1078. 字符串压缩与解压
    PAT 1077. 互评成绩计算
    PAT 1076. Wifi密码
    PAT 1075. 链表元素分类
    PAT 1074. 宇宙无敌加法器
    PAT 1073. 多选题常见计分法
    PAT 1072. 开学寄语
    PAT 1071. 小赌怡情
  • 原文地址:https://www.cnblogs.com/little-uu/p/14019456.html
Copyright © 2011-2022 走看看