zoukankan      html  css  js  c++  java
  • 5.25周赛

    怎么说呢,从排名看来,其实是较之上一次有一定进步的

    不过心情比上一次难受多了

    以前还是能够稍稍比得过的过CocaCola的,但是最近一周都在无休止的颓废之中,虽然没看她的解题记录,但是我估计,这一周她过的题应该是比我多很多的

    差点忘了我是一个蒟蒻,没资格主观臆断人的,orz orz orz。

    不知道为什么老板讲课讲着讲着就颓了,好像也没干什么,但是就是对一些关键知识有所遗漏。讲完课又需要自己去看PDF来补回来,很多时候因为没听懂,所以补的时候也很orz,搞不懂就想着背下来就行了,错过了好多东西。orz orz orz地也就不想做题,板题都搞得不求甚解的,更何况轮到自己实际运用的时候了。

    看PDF没什么动力,打代码的时候也没什么动力,就一直拖拖拖的,看一两页就颓一会儿,稍微看到稍微难一点的就放空,刷题量也就这么下来了。

    仔细想想我的代码功底一直很差,一道题往往只要稍微有一点点难写就写不出来,稍微巧一点点的操作就一头雾水的。平时遇到这些问题好像也没有想一定要自己去解决,经常就是问问大佬们,翻翻题解,翻翻AC代码,有些时候看着太复杂了甚至原理都没有搞懂,照着抄完就交上去了。其实这是很不对的。往后的练习似乎是需要加强一下这方面了,,,不能有逃避心理啊。

    最近貌似经常写错一些很微小很微小的细节,但是造成的后果非常的惨痛。自己看不出来,也不会用debug调试,往往也就是随便逮一个大佬问,应该学会自己找错误的。。。

    颓了。


    A

    不会 暴力求解成功WA15。在sort和差分数组之类的边缘想了很久很久,最后什么都没想出来【其实跟sort和差分根本没关系】

    正解:只需要输入一个a,数组cnt[a - 1],cnt[a],cnt[a + 1] 都++一下,最后扫一遍求出cnt最大值就可以了


    B

    Tarjan板题,单纯求一个强连通分量个数,再去掉只有一个点的个数即可。

    但是因为一道板题(消息的传递)没有搞懂的原因,莫名其妙的敲了一个缩点的代码上去,根据答案改输出(看见样例1的答案给自己最后输出的tot--,然后一看过得了样例就直接交了)

    数据太水了,给了我90分。

    强连通分量个数和缩点完全是两个概念啊,强连通分量就是强连通分量,但是缩点是将一个强连通分量看成一个点,用于找入读为零的点的个数。

    再吐槽一下,数据真的是太水了。


    C

    其实只用讨论四种情况(题意理解我就不说了orz,不过反正我是没有理解出来)
    1.如果当前讨论到的第i块是竖着放的:
    ①如果第i - 1块也是竖着放的:那么它一共有2种选择:ans = (ans * 2)% mod
    ②如果第i - 1块是横着放的:那么它只有2种选择:ans = ans
    2.如果当前讨论到的第I块是横着放的(其实这个时候只能算半块):
    ①如果第i - 1块也是横着放的:那么它一共有3种选择:ans = (ans * 3)% mod
    ②如果第i - 1块是竖着放的:那么它只有2种选择:ans = (ans * 2)% mod
    特别的,如果它是横着放的,那么它影响的范围要广一点,也就是讨论到第i + 1块时ans的值不变
    再用字符串或者字符数组什么的记下来扫一遍讨论就是了
    不过需要注意的是讨论第一个:
    如果第一个是竖着放的时候,那么讨论就从i = 2开始,初值赋为 ans = 3
    如果第一个时横着放的时候,需要从i = 3开始讨论,初值赋为ans = 6
    (这两个就是单纯的排列组合的问题了)


    D

    以前做过的一道题,贪心+后悔堆
    考试的时候把以前的讲义翻出来了orz,结果第一次还因为没有开long long WA了一发.
    其实就是排序,首先替换掉必须替换的一波(如果这个时候次数已经超限了就输出“NIE”),然后因为功率要尽量小的原则,再用剩下的次数用来把符合标准但是差值大的灯泡换掉,要通过建立一个小根堆一个大根堆来维护。


    E

    树形背包DP
    【感觉都快忘了什么是树形DP了,复习一波】
    阶段:每一个以当先点U为根节点的树
    状态dp[u][v]:表示以U为根节点的树给V个用户播放节目的最大收益
    决策:给不给某一个叶子节点播放节目
    方程:

    for(int j = cnt[u]; j >= 1; j --)//一次性背包问题避免重复
    			for(int k = 1; k <= min(cnt[v], j); k ++)//k 不仅要小于j,还要以当前点v为根节点的树的叶子结点总数(cnt[v])
    				dp[u][j] = max(dp[u][j],dp[u][j - k] + dp[v][k] - Len[i]);//Len[i]记录第i号边所需费用
    

    偷偷摸摸发一下代码

    A

    #include <stdio.h>
    #include <bits/stdc++.h> 
    using namespace std;
    int n, ans, woshihaer;
    int a[100005];
    int main(){
    	scanf("%d", &n);
    	for(int i = 1; i <= n; i ++){
    		scanf("%d", &woshihaer);
    		a[woshihaer] ++;a[woshihaer - 1]++;a[woshihaer + 1]++;
    	}
    	for(int i = 1; i <= n; i ++)ans = max(ans, a[i]);
    	printf("%d
    ", ans);
    	return 0;
    }
    

    B

    #include <stdio.h>
    #include <bits/stdc++.h>
    using namespace std;
    
    int ru[10005];
    int n, m, scc, tot, orz, VisitTime,owo;
    bool Map[10005][10005], InStack[10005];
    int dfn[10005], low[10005], Belong[10005],cnt[10005];
    
    stack<int>S;
    
    int Min(int a, int b) {
    	return a < b ? a : b;
    }
    
    void Tarjan(int u){
    	low[u] = dfn[u] = ++VisitTime;
    	S.push(u), InStack[u] = true;
    	
    	for(int v = 1; v <= n; v ++)
    		if(Map[u][v] && !dfn[v]){
    			Tarjan(v);
    			low[u] = Min(low[u], low[v]);
    		}
    		else if(Map[u][v] && dfn[v] && InStack[v]){
    			low[u] = Min(low[u], low[v]);
    		}
    		
    	int v = 0;
    	if(dfn[u] == low[u]){
    		scc ++;int qwq = 0;
    		do{
    			v = S.top();
    			S.pop();
    			InStack[v] = false;
    			Belong[v] = scc;
    			qwq ++;
    			cnt[scc] ++;
    		}while(u != v);
    	}
    
    }
    
    int main(){
    	scanf("%d%d", &n, &m);
    	for(int i = 1; i <= m; i ++){
    		int a, b;
    		scanf("%d%d", &a, &b);
    		Map[a][b] = true;
    	}
    		
    	for(int i = 1 ; i <= n; i ++)if(dfn[i] == 0)Tarjan(i);
    		
    	for(int i = 1; i <= scc; i ++)if(cnt[i] > 1)owo ++;
    	
    	printf("%d", owo);
    }
    

    C

    #include <stdio.h>
    #include <bits/stdc++.h>
    #define ll long long
    #define hdhd 1000000007ll
    using namespace std;
    
    string s1,s2;
    ll n, ans, qwq;//赋初值
    
    int main(){
    	ios::sync_with_stdio(false);
    	
    	cin>>n>>s1>>s2;
    	s1 = " " + s1;
    	s2 = " " + s2;
    	
    	if(s1[1] == s2[1])qwq = 2, ans = 3;
    	else ans = 6, qwq = 3;
    
    	//写成 if(s1[1] == s2[1])qwq = 3, ans = 6;
    	//else ans = 3, qwq = 2;了qwqqqqqqq 
    	
    	if(n == 1){puts("3");return 0;}
    	
    	for(int i = qwq; i <= n; i ++){
    		if(s1[i] == s2[i]){//s1[i] != s1[i + 1]
    			if(s1[i - 1] == s2[i - 1])ans = (ans * 2) % hdhd;
    			else ans = ans;
    		}
    		else{
    			if(s1[i - 1] == s2[i - 1])ans = (ans * 2) % hdhd;
    			else ans = (ans * 3) % hdhd;
    			i ++;
    		}
    	}
    	
    	cout<<ans;
    }
    

    D

    #include <stdio.h>
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    
    int n, k, ans;
    int p[500005], w[500005];
    priority_queue<int,vector<int>,greater<int> >q;
    priority_queue<int>cha;
    
    main(){
    	ios::sync_with_stdio(false);
    	
    	cin>>n>>k;
    	for(int i = 1; i <= n; i ++)cin>>p[i];
    	for(int i = 1; i <= n; i ++)cin>>w[i];
    	
    	sort(p + 1, p + n + 1);
    	sort(w + 1, w + n + 1);
    	
    	int j = n;
    	for(int i = n; i >= 1; i --){
    		while(w[i] <= p[j]){
    			q.push(p[j]);
    			j --;
    		}
    		if(q.size()){
    			ans += q.top();
    			cha.push(q.top()-w[i]);
    			q.pop();
    		}
    		else{k --;ans += w[i];}
    		if(k < 0){
    			cout<<"NIE";
    			return 0;
    		}
    	}
    	while(k > 0){
    		ans -= cha.top();
    		cha.pop();
    		k --;
    	}
    	cout<<ans;
    }
    

    E

    #include <stdio.h>
    #include <bits/stdc++.h>
    #define inf 1e9
    #define maxn 3010
    using namespace std;
    
    int n, p, k, qwq, qaq, tot = 0;
    int dp[maxn][maxn], cnt[maxn];
    int End[maxn], Next[maxn], Last[maxn], Len[maxn];
    
    void TreeDP(int u){
    	for(int i = Last[u]; i; i = Next[i]){
    		int v = End[i];
    		TreeDP(v); 
    		cnt[u] += cnt[v];//cnt记录叶子结点总个数qwq 
    		for(int j = cnt[u]; j >= 1; j --)
    			for(int k = 1; k <= min(cnt[v], j); k ++)//k <= min(cnt[v],j)!!!!! 
    				dp[u][j] = max(dp[u][j],dp[u][j - k] + dp[v][k] - Len[i]);
    	}
    }
    
    int main()
    {
    	ios::sync_with_stdio(false);
    	
    	cin>>n>>p;
    	
        for(int i = 1; i <= n; i ++)for(int j = 1; j <= p; j ++)dp[i][j] = - inf;//~赋~初~值~ 
        
    	for(int i = 1; i <= n - p; i ++){
    		cin>>k;
    		for(int j = 1; j <= k; j ++){
    			cin>>qwq>>qaq;
    			Len[++ tot] = qaq;
    			End[tot] = qwq;
    			Next[tot] = Last[i];
    			Last[i] = tot;
    		}
    	}
                
    	for(int i = n - p + 1; i <= n; i ++){cnt[i] = 1;cin>>dp[i][1];}
    	
    	TreeDP(1);
    	
    	for(int i = p; i; i --)
    		if(dp[1][i] >= 0){cout<<i;return 0;}
    		
    }
    
  • 相关阅读:
    你不能忽视的HTML代码2精编篇
    C#中析构函数和命名空间的妙用
    值类型和引用类型及其它
    这些年我收集的GDI+代码2
    C#中超级好用的字符串
    Javascript的压缩优化
    Spring和hibernate多个数据源的事务管理
    android中Handler,Looper,Message的开发答疑
    Spring引用Tomcat的 JTA事务
    js禁止用户刷新页面
  • 原文地址:https://www.cnblogs.com/qwqq/p/10924760.html
Copyright © 2011-2022 走看看