新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 比赛总结...

本文主要是介绍新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 比赛总结...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

赛后总结:

      TJ:队友晚来了一会,于是我先做了签到题。今天先做了A和B两道签到题,我特别蠢地做错了B两次(两个小错误),然后emmm。队友来了,和她们讲了D题,然后金姐开始搞了。我和彭彭想了一会开始看F神奇序列。序列想了一会,觉得不是很难,找了一个交换数组最少次数的模板套上去就过了。然后我们换了一题,E题。E题一开始理解错题意了,然后一起找规律计算。最后二十多分钟我们找出来了,然后第一发超时,第二发金姐改了就过了。

  我的队友太强了呜呜。

      PJW:刚到的时候,看了C题——CSL的密码,感觉是DP,嗯。。好叭,不会写。然后和谭总一起看了F ,我在纠结是否一个数组递增,另一个数组递减相乘的和是最小的,后来和谭总证了一下,应该是了。然后,又想一个数组递增时求另一个数组递减的交换次数和一个数组递减时求另一个数组递递增的交换次数是不是一样的,后来发现,应该是的。等谭总敲完,我还想着再找找样例的时候,就已经过了!然后,帮ZJH小姐姐找D题字符串的样例,成功卡住了小姐姐的代码。等小姐姐和谭总看E题的时候,我自己敲了一遍字符串,后来也成功被小姐姐的样例卡住了,放弃。最后一点时间,看了一些她们E题打表出来的数字,发现是有规律的!!然后,就是谭总和小姐姐敲、改E题了。

      假以时日,谭总和小姐姐肯定能带我飞 ->_<- !

  JZH:刚到实验室,谭总就说自己已经A了两题,太强了!然后谭总给我讲了D题的题意,然后就开始做D题了,打出来之后被彭彭想出来的样例打到了。。。然后改了一下,还是不行,思考了一下,想不出来果断放弃。看到F题被A了挺多的,就去看F题了,打了半个表,另外半个表不知道为啥,懒得打就手算了,事实证明我不能自己算。。。谭总可能差一点就找到规律了,但是因为我手算错了,直到最后彭彭只看了前三个,发现了规律,我验证了一下第四个,也是对的(事实上我有算错了,结果阴差阳错地规律找对了)

  不能偷懒,打表技术有待提升!希望有一天,队友能带我躺着进final,嘻嘻~

 

A.CSL爱烫头

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#include<iomanip>
#include<algorithm>
using namespace std;
typedef long long LL;
#define MAX 10005
int main()
{int n;cin >> n;if (n < 1) cout << "None" << endl;else if (n == 1) cout << "XiZhiTang" << endl;else if (n == 2) cout << "YingHuaTang" << endl;else if (n >= 3) cout << "BigBoLang" << endl;system("pause");return 0;
}
View Code

 

B.CSL的英语考试

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#include<iomanip>
#include<algorithm>
using namespace std;
typedef long long LL;
#define MAX 10005
int p[MAX], visit[MAX] = { 0 }, la[MAX] = { 0 };
struct node
{int id, people;double sum, num;
};
node person[MAX], ans[MAX], p2[MAX];
bool comp(const struct node&a, const struct node&b)
{if (a.sum == b.sum)return a.id < b.id;return a.sum > b.sum;
}
int Find(int x)
{int temp = x;while (p[temp] != temp)temp = p[temp];return temp;
}
void join(int x, int y)
{int t1, t2;t1 = Find(x);t2 = Find(y);if (t1 != t2){if (t1 > t2){p[t1] = t2;}else p[t2] = t1;}
}int main()
{int n;scanf("%d", &n);map<char, int>a;for (int i = 0; i < 26; i++){char c;cin >> c;a[c] = i;}for (int i = 0; i < n; i++){char s1[1500], s2[1500];cin >> s1 >> s2;int len1 = strlen(s1), len2 = strlen(s2);int len = min(len1, len2);int flag = -1;for (int i = 0; i < len; i++){if (a[s1[i]] > a[s2[i]]){flag = 1;break;}else if (a[s1[i]] < a[s2[i]]){flag = 0;break;}}if (flag == -1 && len1 == len2) flag = -1;else if (flag== -1&&len == len1) flag = 0;else if (flag == -1&& len == len2) flag = 1;if (flag == 1) cout << ">" << endl;else if (flag == 0) cout << "<" << endl;else cout << "=" << endl;}system("pause");return 0;
}
View Code

 

C.CSL的密码

题目意思很简单。

简单做法:给一段字符串,n为字符串长度,m为字符串作为密码子串最短的长度。首先,长度为m~n的所有子串总数(不去重)为(n - m + 1)*(n - m + 2) / 2,然后我们开始一段段取,运用substr取对应长度的子串,放进set去重。如果set里有了,记录多余重复的子串,然后最后答案减掉就好啦。

补充:题目里字符串是随机出现的,所以长度越长,在长度长的情况下 几乎可以认为都不同。

CSL聚聚说:为了让不会后缀数组/自动机的同学可以过这题 强行出成了随机。

我还是太菜了。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<stack>
using namespace std;
const int MAXN = 130000;
#define inf 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
set<string>s[100];
int main()
{ll n, m,count=0;string a;cin >> n >> m >> a;ll sum = (n - m + 1)*(n - m + 2) / 2;for (int i = m; i <= min(n,15LL); i++){for (int j = 0; i + j - 1 < a.size(); j++){string temp = a.substr(j, i);if (s[i].find(temp) != s[i].end())count++;else s[i].insert(temp);}}cout << sum - count << endl;system("pause");return 0;
}
View Code

 

D:CSL的字符串

首先将字符串出现的每个字符都统计一遍数量,然后从左往右遍历字符串,用数组模拟栈存答案字符串。

如果这个字符串被访问过了就跳过。

如果遇到一个字符,比栈顶的元素小,并且栈顶的元素在后面还会出现,就把栈顶的弹出来,重新标记为未访问过的。

把较小的存进栈里。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<string>
#include<vector>
#include<ctime>
using namespace std;
const int MAXN = 130000;
#define MAX_DISTANCE 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define ll long long
#define SIGN(A) ((A > 0) ? 1 : -1) 
#define NO_DISTANCE 1000000
int main()
{char s[MAXN];int vis[MAXN] = { 0 }, num[MAXN] = {0}, stack[MAXN];scanf("%s", s);int top = 0;int len = strlen(s);for (int i = 0; i < len; i++){num[s[i]]++;}for (int i = 0; i < len; i++){num[s[i]]--;if (vis[s[i]]) continue;while (top > 0 && stack[top] > s[i] && num[stack[top]] > 0){vis[stack[top]] = 0;top--;}stack[++top] = s[i];vis[s[i]] = 1;}for (int i = 1; i <= top; i++){char ans =(char)stack[i];cout << ans;}cout << endl;system("pause");
}
View Code

 

 

E.CSL的魔法

一开始看题目觉得挺难的。后来和队友想了一下,觉得上下序列每一次都可以交换一对数字,和先排好上面,计算移动下面序列的位置的消费是相同的。

于是乎,套用了一个交换数列的最小次数的模板就过了。。。感谢出题组。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#include<iomanip>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long LL;
#define MAX 10005
int p[MAX], visit[MAX] = { 0 }, la[MAX] = { 0 };
struct node
{int id, people;double sum, num;
};
node person[MAX], ans[MAX], p2[MAX];
bool comp(const struct node&a, const struct node&b)
{if (a.sum == b.sum)return a.id < b.id;return a.sum > b.sum;
}
int Find(int x)
{int temp = x;while (p[temp] != temp)temp = p[temp];return temp;
}
void join(int x, int y)
{int t1, t2;t1 = Find(x);t2 = Find(y);if (t1 != t2){if (t1 > t2){p[t1] = t2;}else p[t2] = t1;}
}struct number
{int a, b;
}x[150000];
bool cmp(number aa, number bb)
{return aa.a > bb.a;
}
/*bool cmp2(num aa, num bb)
{return aa.a > bb.a;
}*/int getMinSwaps(vector<int> &nums) {vector<int> nums1(nums);sort(nums1.begin(), nums1.end());unordered_map<int, int> m;int len = nums.size();for (int i = 0; i < len; i++) {m[nums1[i]] = i;}int loops = 0;vector<bool> flag(len, false);for (int i = 0; i < len; i++) {if (!flag[i]) {int j = i;while (!flag[j]) {flag[j] = true;j = m[nums[j]];}loops++;}}return len - loops;
}int main()
{int n;cin >> n;for (int i = 0; i < n; i++){cin >> x[i].a;//x2[i].a = x[i].a;
    }for (int i = 0; i < n; i++){cin >> x[i].b;//x2[i].b = x[i].b;
    }sort(x, x + n, cmp);vector<int>num;for (int i = 0; i < n; i++)num.push_back(x[i].b);int res = getMinSwaps(num);cout << res << endl;system("pause");return 0;
}
View Code

 

F.CSL的神奇序列

规律题。先假设w=1,然后求出a1,a2,a3,a4,……。然后与n!和2^n进行运算。

算出来的例子:

n=1  1   1

n=2  3   3

n=3  15  3*5

n=4  105  3*5*7

n=4  945  3*5*7*9

……

然后初始化存进数组里,最后ans[n]*w取模输出即可。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#include<iomanip>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef unsigned long long ull;
#define MAX 1000005
#define mod 998244353
ull a[MAX];
void init() {a[1] = 1;for (int i = 2; i <= 1000000; i++){a[i] = (a[i - 1] * (2 * i - 1)) % mod;}
}
int main()
{int w, q,n;cin >> w >> q;init();while (q--){int n;cin >> n;ull ans = a[n];ans =(ans*w)%mod;cout << ans << endl;}system("pause");return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Tangent-1231/p/10632343.html

这篇关于新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛 比赛总结...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/586590

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数