zoukankan      html  css  js  c++  java
  • 考试2

    T1

    题目描述

    Mirko很快厌倦了Jetpack Joyride并开始在他的手机上玩神奇宝贝GO。这个游戏的玩点之一就是神奇宝贝的进化。 为了进化物种为Pi的神奇宝贝,Mirko必须提供Ki个用于该物种神奇宝贝的糖果。在神奇宝贝进化后,他能拿回2个糖果。神奇宝贝只能在为他们的物种准备的糖果的帮助下进化。 Mirko有N种神奇宝贝,并且为物种Pi的神奇宝贝提供Mi个糖果,他想知道他可以进化多少次神奇宝贝。 他还想知道哪个神奇宝贝可以进化最多次。如果有多个这样的神奇宝贝,输出一个编号最小的神奇宝贝。换句话说,在输入数据中最早出现的那个。

    输入

    第一行输入包含整数N(1≤N≤70)。表示神奇宝贝种类的数量。接下来2N行包含N组数据,其中包含: ●第2i行包含字符串Pi,由最多20个字组成。表示第i种神奇宝贝的名称; ●第2i+1行包含整数Ki(12≤Ki≤400)和Mi(1≤Mi≤104),分别第i种神奇宝贝的进化所需的糖果数量和Mirko为这种神奇宝贝准备的糖果总数。

    输出

    第一行输出一个整数。表示Mirko可以进化的神奇宝贝的总次数。 第二行输出一个字符串。表示可以进化最多次的神奇宝贝的名称。

    样例输入

    4
    Caterpie
    12 33
    Weedle
    12 42
    Pidgey
    12 47
    Rattata
    25 71

    样例输出

    14
    Weedle

    解题思路

    模拟即可

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    using namespace std;
    struct node {
    	string p;
    	int k,m,num;
    }a[105];
    int n;
    int sum,maxn;
    string ans;
    int main(){
    	scanf ("%d",&n);
    	for (int i = 1;i <= n;i ++){
    		scanf ("
    ");
    		cin>>a[i].p;
    		scanf ("%d%d",&a[i].k,&a[i].m);
    		while (a[i].k <= a[i].m){
    			a[i].m -= a[i].k;
    			a[i].num ++;
    			a[i].m += 2;
    		}
    		if (a[i].num > maxn){
    			maxn = a[i].num;
    			ans = a[i].p;
    		}
    		sum += a[i].num;
    	}
    	printf("%d
    ",sum);
    	cout<<ans<<endl;
    }

    T2

    题目描述

    小 Zeljko 一直在阁楼里读他奶奶的旧信,并且发现了一个长度为 N 的单词。 不幸的是,由于溢出的墨水,他不知道单词的内容。他把看不清的 M 个字母每 个字母都用一个字符'#'替换后,在一张纸上重写了这个词。他把那张纸递给 了他的奶奶,对于每个看不清的字母,奶奶给了他 K 个不同的可能。在那之后, Zeljko 在笔记本中写下了所有可能的单词,并决定仔细查看他们的属性,以确 定原始单词是什么。在看到笔记本上写下的单词后,他的奶奶意识到他们正在 寻找的是按字典序排列的第 X 个单词。Zeljko 在他们学校学习字母表的那天生 病了,所以他要求你帮助他确定原来的单词。 输入 第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符'#'组成。 表示 Zeljko 找到的单词,其中字符'#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的 保证 X 总是小于等于能构造出的单词的总数。

    输入

    第一行输入包含整数 N,M,K 和 X(1≤N≤500,1≤M≤N,1≤K≤26,1≤X≤ 1e9)。分别表示单词的长度,看不清的字母的数量,奶奶给出的字母的数量和 原单词是字典序的第几个。 第二行输入包含一个长度为 N 的字符串,由小写英文字母和字符'#'组成。 表示 Zeljko 找到的单词,其中字符'#'表示看不清的字母。 接下来 M 行中的每一行包含一个长度为 K 的字符串,由 K 个不同的小写英文 字母组成。第 2+i 行的 K 个字母表示第 i 个看不清的字母的 K 种可能。 保证 X 总是小于等于能构造出的单词的总数。

    输出

    输出一个字符串。表示原本的单词。

    样例输入

    9 2 3 7
    po#olje#i
    sol
    znu

    样例输出

    posoljeni

    解题思路

    至于字典序那肯定只是#可能的字母的排列所有的字典序。所以我们需要对每一个#进行排序,最后我们就可以利用k进制来求出每一个#号对应的字母。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    using namespace std;
    int n,m,k,x,cnt,ans[1005];
    char s[1005],mp[505][30],c;
    int main(){
    	//freopen("tavan.in","r",stdin);
    	//freopen("tavan.out","w",stdout);
    	scanf("%d%d%d%d
    ",&n,&m,&k,&x);
    	scanf ("%s",s + 1);
    	for (int i = 1;i <= m;i ++){
    		scanf("
    ");
    		for (int j = 1;j <= k;j ++){
    			scanf ("%c",&mp[i][j]);
    			for (int k = j;k > 1;k --){
    				if (mp[i][k] < mp[i][k - 1])
    					swap(mp[i][k],mp[i][k - 1]);
    			}
    		}
    	}
    	int pos = m;
    	while (pos){
    		int t = x % k;
    		ans[pos] = t;
    		if (ans[pos] == 0)
    			ans[pos] = k;
    		x /= k;
    		if (t != 0)
    			x ++;
    		pos --;
    	}
    	int cnt1 = 0;
    	for (int i = 1;i <= n;i ++){
    		if (s[i] == '#')
    			printf("%c",mp[++ cnt1][ans[++ cnt]]);
    		else 	
    			printf("%c",s[i]);
    	}
    	printf("
    ");
    }

    T3

    题目描述

    Do Geese See God?或者,Was It A Rat I Saw?没关系,这只是展示 Mislav 对回文的热爱的不必要的介绍。帮他解决以下任务! 设 A 是 N 个整数构成的数组。我们说 A 是回文,如果 A[i]=A[N-i+1]对于每 个 i 都成立,其中 A[i]表示数组 A 的第 i 个元素,并且数组中的第一个元素编 号是 1。 Mislav 可以通过以下方式修改数组:在一次操作中,他选择该数组的两个 相邻元素并用它们的和替换它们。注意,每次操作后数组中元素的数量将减少 1。 Mislav 想知道为了让数组变为回文的,他必须做出最少多少次操作。

    输入

    第一行输入包含整数 N(1≤N≤1e6),表示数组中的元素个数。 第二行输入包含 N 个用空格分隔的正整数,表示 Mislav 数组中的元素。数 组中的数字最多为 1e9。

    输出

    输出一个整数。表示 Mislav 要把数组变为回文所需的最少操作次数。

    样例输入

    3
    1 2 3

    样例输出

    1

    解题思路

    思路确实挺简单的,要回文,那首先肯定首尾要相等,我们就用l,r表示首尾。

    如果首尾不相等,那肯定要处理,总不可能是多的往前加,所以说是小的那一个数往前面加。

    相等的话显然可以不处理了,于是l++,r--,处理前面去了。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    using namespace std;
    int ans,a[1000005],n;
    int main(){
    	scanf ("%d",&n);
    	for (int i = 1;i <= n;i ++)
    		scanf ("%d",&a[i]);
    	int l = 1,r = n;
    	while (l <= r){
    		if (a[l] < a[r]){
    			a[l + 1] += a[l];
    			l ++;
    			ans++;
    		}
    		else if (a[l] > a[r]){
    			a[r - 1] += a[r];
    			r --;
    			ans++;
    		}
    		else {
    			l++,r--;
    		}
    	}
    	printf("%d",ans);
    }

    T4

    题目描述

    Slavko很无聊,所以他把正整数填到N*N的方阵中。

    如果他填出来的方阵满足以下条件,他会特别高兴:

    ●每行中的数字的平均值是一个位于同一行的整数。

    ●每列中的数字的平均值是一个位于同一列的整数。

    ●表中的所有数字都不同。

    帮助Slavko找到一种会让他开心的填法。

    输入

    第一行输入包含整数N(1≤N≤100)。表示方阵的行数和列数

    输出

    输出N行,每行输出N个由空格分隔的整数。令第i行中的第j个数字对应于Slavko将在方阵的第i行第j列写下的值。

    所有数字必须大于0且小于109。

    如果有多个解决方案,则输出任意一个。

    如果没有任何解决方案,则输出-1。

    样例输入

    3

    样例输出

    1 2 3

    4 5 6

    7 8 9

    解题思路

    对于这种题目,一般来说推起来难度较大,所以你又找不到规律,既然都有电脑,我们需要先打个暴力。

    然后我们就发现...奇数就是直接按顺序输就行了,真得劲。

    然后就是偶数了,4跳得挺快,然后打6...跳了30分钟还没出来...

    于是开始讲正解了。

    奇数直接输,不解释。

    偶数很慢,这就要用到我们一个推的公式。

    管他这么多,我们就将一排中1 到 n - 1按顺序排好,就假定平均数是n - 1所在的数,嗯,算的出最后一个。

    然后后一排,我们继续按顺序,由于题目要求不重复,我们就让第一个数等于上一排的最后一个数 + 1.然后又是这样搞。

    不知不觉到了最后一排。

    嗯,我们再那样就行不通了,但我们可以竖着来看,第一列中1到n - 1我们处理好了,于是n我们也可以处理出来,然后再按顺序。处理到n,n。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    using namespace std;
    int n;
    int a[105][105];
    int main(){
    	scanf ("%d",&n);
    	if (n == 2){
    		printf("-1");
    		return 0;
    	}
    	if (n % 2 == 1){
    		for (int i = 1;i <= n;i ++){
    			for (int j = 1;j < n;j ++)
    				printf("%d ",(i - 1) * n + j);
    			printf("%d
    ",(i - 1) * n + n);
    		}
    		return 0;
    	}
    	else {
    		for (int i = 1;i < n;i ++){
    			a[i][1] = a[i - 1][n] + 1;
    			int sum = a[i][1];
    			for (int j = 2;j <n;j ++){
    				a[i][j] = a[i][j - 1] + 1;
    				sum += a[i][j];
    			}
    			a[i][n] = a[i][n - 1] * n - sum;
    		}
    		int sum = 0;
    		for (int i = 1;i < n;i ++)
    			sum += a[i][1];
    		a[n][1] = a[n - 1][1] * n - sum;
    		sum = a[n][1];
    		for (int i = 2;i < n;i ++){
    			a[n][i] = a[n][i - 1] + 1;
    			sum += a[n][i];
    		}
    		a[n][n] = a[n][n - 1] * n - sum;
    	}
    	for (int i = 1;i <= n;i ++){
    		for (int j = 1;j < n;j ++)
    			printf("%d ",a[i][j]);
    		printf("%d
    ",a[i][n]);
    	}
    }
  • 相关阅读:
    那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
    那些年读过的书《Java并发编程实战》二、如何设计线程安全类
    那些年读过的书《Java并发编程实战》一、构建线程安全类和并发应用程序的基础
    重读《深入理解Java虚拟机》七、探究Java内存模型
    重读《深入理解Java虚拟机》六、Java泛型 VS C#泛型 (伪泛型 VS 真泛型)
    重读《深入理解Java虚拟机》五、虚拟机如何执行字节码?程序方法如何被执行?虚拟机执行引擎的工作机制
    重读《深入理解Java虚拟机》四、虚拟机如何加载Class文件
    input 文本框禁止输入表情
    win7右下角无线网图标显示未连接,但是实际上已连接上,也能上网
    history.back(-1)和history.go(-1)的区别
  • 原文地址:https://www.cnblogs.com/lover-fucker/p/13566675.html
Copyright © 2011-2022 走看看