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\n", 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;}
		
}
posted @ 2019-05-26 00:26  羽错光阴  阅读(119)  评论(1编辑  收藏  举报