大假期第三次测试

这次考试感觉心态爆炸,一开始是一个图论,我图论板子不太熟,于是就先跳过 ,先看T2,想了一会,感觉有些思路,就开始写,写了大概20分钟就写完了,但是样例输出是0,瞬间感觉整个人都不好了

大假期第三次测试

 

然后就开始调试,调啊调,调了半个小时,调不出来,强忍着砸掉键盘的冲动,又重新开了一个文件重新写,结果写完后又调了半个小时,又没过,然后又打了一遍,又没过

大假期第三次测试

最后折腾到10点也没过,测试时间都过去一半了,心态爆炸,别的题都不想写了。又没网,就不知道该干什么,迷茫了不知道多久,忽然想起虎哥说T4简单,就兴冲冲的去写T4了。T4果然简单,我就用大概不到一分钟就有思路了,这个题说了是在最优情况,所以我就想这题看似是概率实则是图论,先构建一个有向图,判断最少用几个点开始遍历可以遍历完所有的结点,假设是k个点,结果就是(n-k/n,最后保留6位小数。思路特别清晰,开始打码,然后发现不会打 

 大假期第三次测试

然后 自闭.jpg,啥也不干了。

最后三十分钟看了一眼T3woc,原题,于是赶紧把T3打上去了,拿了100分。T1也木得时间大。。。。。。

 

这次考试也算是一个成功的反面教材,吸取教训,不能死扣一道题,别上头,一上头就容易死扣。不能只克制自己不做题的欲望,也要克制做题的欲望。

 

PS:本来我是不会犯这种死扣一个题的错误的,今天老姚说了,我就犯了。。。本人奥赛蒟蒻,这次以为T2会是我在测试中第一次AC的题,结果输出居然是0,瞬间上头了,具体感觉不亚于玩铠开大四杀上头的感觉。。。

 题解

T1:

题目描述

中中酷爱滑雪,某日突发奇想,带领所有BDEZ的OIER去Alps滑雪,不幸的是,中中和OIER们遭遇了雪崩,除了中中,所有的OIER们都埋在了雪坑里,此时,中中救援队闪亮登场~!(中中救援队只有中中一个人!Orz!)

雪崩之后,出现了N个雪坑,每个雪坑都有一名OIER深陷其中,只有中中幸免,现在中中找到了M条双向道路,每条道路都会连接两个雪坑,但是,由于中中是路痴(-_-||),所以中中希望去除M条道路中尽可能多的道路,但是还要保证任一雪坑都能到达其他的雪坑,所以要先选择留下N-1条道路,中中可以从任意一个雪坑出发,并且任务完成后要回到出发点(起点的雪坑和终点的雪坑也需要消耗体力),而且中中只记得他选择的道路 中中每到一个雪坑i,都会消耗一定的体力值t[i],即使这个雪坑的OIER已被救出。第j条道路连接x,y两个雪坑,而从x到达y也需要消耗体力值energy 由于时间紧迫,中中请你这名OIER帮助他计算下救出这N名OIER所消耗的最小体力值是多少

输入格式

输入第一行两个整数N和M,表示有N名OIER,M条连接的道路

接下来N行,每行一个整数t[i],表示第i个雪坑需要消耗中中的体力值

然后M行,每行三个整数x,y,energy,表示从x坑滑到y坑需要消耗的体力值为energy

输出格式

第1行,一个整数,为中中消耗的最小体力值

样例

样例输入

5 7
6
5
13
8
18
4 1 7
5 2 5
1 5 16
2 3 20
3 1 18
4 3 12
2 4 15

样例输出

这个题就是安慰奶牛那个题,不写题解了,代码奉上
大假期第三次测试

#include<bits/stdc++.h>
using namespace std;
int n,p;
int node[10001],f[10001];
struct E{int x,y,d;}e[100001];
bool cmp(E e1, E e2){return e1.d < e2.d;}
int find(int x){return f[x] == x ? x : f[x] = find(f[x]);}
int Kruscal(){
    int ans = 0;
    sort(e,e+p,cmp);
    for(int i = 0; i < p; i++){
    int xx = find(e[i].x);
    int yy = find(e[i].y);
    if(xx != yy){
        f[xx] = yy;
        ans += e[i].d;  
    }
    }
    return ans;
}
void init(){
    scanf("%d%d",&n,&p);
    for(int i = 0; i < n; i++)scanf("%d",&node[i]);
    for(int i = 0; i < p; i++){
    scanf("%d%d%d",&e[i].x, &e[i].y, &e[i].d);
    e[i].d=e[i].d*2+(node[e[i].x-1]+node[e[i].y-1]);
    }
    for(int i=0;i<n;i++)f[i]=i;
}
int main(){
    init();
    int min = 100000;
    for(int i=0;i<n;i++)if(node[i] < min) min = node[i];
    printf("%dn", min+Kruscal());    
    return 0;
}

View Code

T2

题目描述

农场主约翰家人有N (3 <= N<= 10,000)件家务活需要完成,完成第i件家务活需要Ti(1 <=Ti<= 100)的时间,在做第i件家务活之前约翰必须完成若干个家务活,我们称这些家务为i的必备家务。至少有一个家务没有必备家务,第一件家务没有必备家务。

约翰已经安排好完成家务活的顺序,家务活k的必备家务活只会出现在区间[1,k-1]之间。没有依赖关系的家务活可以同时进行。

现在请你计算约翰家人完成所有家务的最短时间。

输入格式

第一行为一个整数N,表示有N件家务活。

接下来2~n+1行,第i+1行前两个数分别为Ti和ki,表示完成第i件家务需要Ti的时间,有ki个必备家务,接着k个数表示第i件家务的必备家务。

输出格式

只有一行,约翰完成所有家务的最短时间。

样例

样例输入

7
5 0
1 1 1
3 1 2
6 1 1
1 2 2 4
8 2 2 4
4 3 3 5 6

样例输出

23

我一开始没有用正解,算是一个暴力枚举吧,白嫖了80.
枚举时间,T掉的代码奉上
大假期第三次测试

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int read(){//快读,只能读数字,你用它读字符也可以,字符串必须用for循环,不懂的小伙伴可以用cin或scanf,快读写错了0分别找我 
 4     int re=0,l=1;char ch=getchar();
 5     while(ch<'0'||ch>'9'){if(ch=='-')l=-1;ch=getchar();}
 6     while(ch>='0'&&ch<='9'){re=re*10+ch-'0';ch=getchar();}
 7     return re;
 8 }
 9 struct gdx{
10     int time,sl,d[1000];
11     bool fin;//判断是否已经完成
12     int js;//因为枚举时间,用来储存结束的时间
13 }a[10000+100];
14 int n,m,l,ans;//ans储存已经完成家务的件数
15 bool check(int x){//检查是否可以完成
16     if(a[x].fin)return 0;//已经完成,不需要再进行
17     for(int i=1;i<=a[x].sl;i++)if(!a[a[x].d[i]].fin)return 0;//必备家务未完成,不能进行
18     return 1;
19 }
20 int p;
21 int main(){
22     a[0].fin=true;
23     n=read();//快读
24     for(int i=1;i<=n;i++){//输入数据+初始化
25         a[i].fin=0;
26         a[i].time=read();
27         l+=a[i].time;//当时为了优化时间,现在发现没用,可删除
28     a[i].js=0x3f3f3f3f;//必须的初始化,否则会输出0
29         a[i].sl=read();
30         for(int j=1;j<=a[i].sl;j++)a[i].d[j]=read();
31     }
32     for(int i=0;i<=l;i++){//枚举时间
33         for(int j=1;j<=n;j++){
34             if(a[j].js==i){a[j].fin=1;ans++;}//到达结束时间,家务做完
35         if(ans==n){printf("%dn",i);return 0;}//全部完成,输出时间即可
36     }
37     for(int j=1;j<=n;j++)if(a[j].js==0x3f3f3f3f)if(check(j))a[j].js=i+a[j].time;//开始做家务
38     }
39     return 0;
40 }

View Code

正解:dp这个正解的难度属实很小,肥肠容易看明白

大假期第三次测试

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int read(){//快读 
 4     int re=0,l=1;char ch=getchar();
 5     while(ch<'0'||ch>'9'){if(ch=='-')l=-1;ch=getchar();}
 6     while(ch>='0'&&ch<='9'){re=re*10+ch-'0';ch=getchar();}
 7     return re;
 8 }
 9 int n,m,a[1000000+10],ans;//a数组储存每个家务的完成时间 
10 int main(){
11     n=read();
12     for(int i=1,time,y;i<=n;i++){
13         time=read();y=read();
14         for(int j=1,u;j<=y;j++){
15             u=read();
16             a[i]=max(a[i],a[u]);//a[i]的起始时间必须是其必备家务的最大结束时间 
17         }
18         a[i]+=time;//a[i]从起始时间变成结束时间 
19         ans=max(a[i],ans);//答案 
20     }
21     cout<<ans<<endl;//输出答案 
22     return 0;
23 }

View Code

 

T3T4不想写了,气不气大假期第三次测试

 

 

原文链接: https://www.cnblogs.com/gdxzq/p/13331057.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    大假期第三次测试

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/367692

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:55
下一篇 2023年3月2日 下午5:55

相关推荐