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简单算法--求100以内素数
    ubuntu 16.04 chrome flash player 过期
    java 网络API访问 web 站点
    java scoket (UDP通信模型)简易聊天室
    leetcode1105 Filling Bookcase Shelves
    leetcode1140 Stone Game II
    leetcode1186 Maximum Subarray Sum with One Deletion
    leetcode31 Next Permutation
    leetcode834 Sum of Distances in Tree
  • 原文地址:https://www.cnblogs.com/lover-fucker/p/13566675.html
Copyright © 2011-2022 走看看