16级长安大学ACM新生杯<第一次现场赛>

来源:互联网 发布:人工智能读后感 编辑:程序博客网 时间:2024/06/11 05:27

ABC签到题、

D卡片游戏<坑在两个int相乘时变成long long的长度才赋值给long long的变量是错误的,应该把int的值就赋给long long的变量然后再相乘赋给另一个变量>

sort(a,a+26,cmp1) 其中26这个地方最好不是一个变量,因为当变量的值较大时,会导致数组越界

贪心,从最多卡片数量的那种开始取,可以获得硬币的最大值。

题意<贪心>
Description
ctr与fdf在玩一个游戏,ctr有n张卡片,每张卡片上写了一个大写字母(A − Z) 。fdf要从中选出k张卡
片(1 ≤ k ≤ n),ctr会根据fdf选择的卡片奖励给fdf一定数目的硬币。
ctr制定了这样的奖励规则:
对于fdf的第i张卡片(1 ≤ i ≤ k),用f i 表示fdf选择的k张卡片中字母与第i张相同的卡片数。最后
会ctr给fdf的硬币总数为 ∑︀ k
i=1 f i 。
告诉你n张卡片上的字母,请你帮fdf设计一种选择方案使他能获得最多的硬币,并输出能获得的最大
硬币数量。
Input
输入第一行为一个整数T(T ≤ 25),表示一共有T组测试数据。
对于每组测试数据:
第一行有两个整数n和k(1 ≤ k ≤ n ≤ 10 5 ),表示卡片总数与需要选择的卡片数。
第二行有n个大写字母(字母之间没有空格) ,其中第i个字母代表了第i张卡片上的字母。
Output
对于每组测试数据,输出一个整数表示fdf能获得的最大硬币数量。
Sample Input
2
15 10
DZFDFZDFDDDDDDF
6 4
YJSNPI
Sample Output
82
4
Hint
对于第一组样例,fdf的最佳方案是选择9个‘D’卡片,和任意的一张其他卡片。其中对于每张‘D’
卡片,fdf能得到9个硬币,对于唯一一张不是 ′ D ′ 的任意卡片,fdf能得到1个硬币,故总共可以得到82个硬
币。

代码:

#include <iostream>#include <algorithm>#include <string.h>using namespace std;int f1[28];int cmp1(int a,int b){return a>b;}int main(){freopen("in.txt","r",stdin);int n,a,b,g;long long sum=0;char t;cin >> n;int i,j,k;for(i=0;i<n;i++){cin >> a >> b;memset(f1,0,sizeof(f1));for(k=0;k<a;k++){cin >> t;f1[t-'A']++;}sort(f1,f1+26,cmp1); g=0; long long t2; sum=0;while(b){if(b>=f1[g]){t2=f1[g];sum+=t2*t2;b=b-f1[g];}else{t2=b;sum+=t2*t2;break;}g++;}cout << sum << endl;}return 0;} 


E无尽拼图<1、注意从全0是正确的,但是从非0那张拼图开始往前推,推到第一张的值,第一张推出来的可能是负数或0,这是错误的,要判定这个图是否有非0。

2、如果在输入的循环中有一个判定然后break,会导致后面的输入全部出错。

题意

E 无尽拼图
Description
彩虹岛人民世世代代守护着一块无边无垠的无尽拼图,人们坚信是这块完整的拼图庇护着整座彩虹岛。
无尽拼图是由一些数字组成的,处在第i行第j列的拼图上的数字恰好为i + j − 1。下图为拼图的部分示意
图。


邪恶的大魔王为了破坏彩虹岛的和平,他将无尽拼图打碎成了无数碎片,每一个碎片仍然是一个矩形。
为了防止有人将拼图复原,大魔王将碎片上的一些数字抹去(抹去的部分数字用0表示) ,并且混入了一些伪
造的拼图。然而这并不能阻挡彩虹岛人民复原拼图的决心,他们想请你帮忙判断一些拼图碎片是否有可能是
真正的无尽拼图碎片(若碎片存在一种填补被抹去数字的方案使其成为原来无尽拼图的一部分,就认为它有
可能是真正的无尽拼图碎片) 。
Input
输入第一行为一个整数T(T ≤ 50),表示一共有T组测试数据。
对于每组测试数据:
第一行是两个整数n、m(1 ≤ n,m ≤ 1000),表示碎片的行、列数。
接下来有n行,每行m个数字,数字之间用空格隔开,表示拼图碎片(数字保证不大于10 8 ,其中正数表
示碎片上的数字,0表示此处数字被抹去) 。
Output
对于每组测试数据:若有可能是真正的无尽拼图碎片,输出“YES” ;否则,输出“NO” 。
7
Sample Input
2
3 3
4 0 6
0 6 0
0 0 0
3 4
0 0 0 0
0 0 0 0
3 4 0 7
Sample Output
YES
NO
Hint
对于第一组样例,它原来可能是:
4 5 6
5 6 7
6 7 8
即有可能是真正的无尽拼图碎片。
对于第二组样例,无论怎样填补被抹去的数字,都不可能是真正的无尽拼图碎片。

代码:

#include <iostream>using namespace std;int main(){int t1,t2,i,j,k,n;long long t3,t4;bool f1,f2;cin >> n;for(k=0;k<n;k++){cin >> t1 >> t2;f1=0;f2=0;for(i=0;i<t1;i++){for(j=0;j<t2;j++){cin >> t3;if(t3!=0&&f1==0){t4=t3-i-j;f1=1;}if(f1&&t3){if(t3!=t4+i+j)f2=1;}if(f2)break;}if(f2)break;}if(f2||(f1&&t4<1))cout << "NO" << endl;else cout << "YES" << endl;}return 0;}

H七彩原石<暴力回文,通过从中间到两边扩张的方法判断回文>

the reason of failure:1、注意sum的累加全部为sum+而别写成sum

2、sum+=这种累加的过程,注意加的变量,别因为这个某些过程{}中改变了变量才加sum,注意是加改变前的sum还是改变后的sum

for(int i=0;i<n;i++)

sum+=b                    

b=a[i]             此时两个sum所加的值是不一样的

sum+=b

题意

H 七彩原石
Description
有一天,一位彩虹岛的居民制造了一个大新闻,他在深山中发现了一块巨大的七彩原石。这块七彩原石
呈长条状,并分成长度不同的许多段,每一段有一种颜色(赤、橙、黄、绿、青、蓝、紫中的一种) 。经过
专业人士的鉴定,这块原石是上好的建材。彩虹岛的工匠们决定用这块原石建造一座横跨东西的彩虹桥。为
了整体的美观性,彩虹桥必须是左右对称的(对称指的是彩虹桥两侧距离中线距离相等的地方颜色必须相
同) ,因此工匠们不会选用整块原石,而是从中截取连续的一部分作为彩虹桥的建材。同时,他们希望这座
桥能够尽可能的长。
给出彩虹原石每一段的颜色与长度,请计算彩虹桥的最大长度。
Input
输入第一行为一个整数T,表示一共有T组数据。
对于每组测试数据:
第一行为一个整数N(N ≤ 2000),表示七彩原石共分成N段。
接下来有N行,第i行有2个整数color i 与lengtℎ i ,表示七彩原石第i 段的颜色与长度(1 ≤ color i ≤ 7,
表示7种颜色,1 ≤ lengtℎ i ≤ 10 9 ) 。
Output
对于每组测试数据,输出一个整数L表示彩虹桥的最大长度。
Sample Input
2
1
1 1
5
4 1
1 1
2 3
1 2
3 1
Sample Output
1
5
13
Hint
对于第一组样例,整块原石只有红色的一段,本身就是对称的,可以取用全部。
对于第二组样例,原石有五段,依次是长度为1的绿色,长度为1的红色,长度为3 的橙色,长度为2的
红色,长度为1的黄色。按下图方式截取,最长的对称部分长度为5。

代码:

#include <iostream>#include <algorithm>#include <string.h>using namespace std;int m;struct ttt{char a;long long length;}fun[2010];long long huiwen(ttt fun[],int mid){int r1=mid+1,l1=mid-1;long long f1=0,f2=0,sum1=fun[mid].length;while(fun[mid].a==fun[r1].a){sum1+=fun[r1].length;//cout << "r1=" << r1 << "sum1=" << sum1 << endl;r1++;}while(fun[l1].a==fun[r1].a&&r1<m&&l1>=0){//cout << "l1=" << l1 << "r1=" << r1 << "sum1="<<sum1 <<endl;if(fun[l1].length-f1==fun[r1].length-f2){sum1+=fun[l1].length-f1+fun[l1].length-f1;l1--;r1++;f1=0;f2=0;}else if(fun[l1].length-f1>fun[r1].length-f2){sum1+=fun[r1].length-f2+fun[r1].length-f2;if(f1){f1+=fun[r1].length;}else if(f2){f1=fun[r1].length-f2;f2=0;}else{f1=fun[r1].length;}r1++;}else if(fun[l1].length-f1<fun[r1].length-f2){sum1+=fun[l1].length-f1+fun[l1].length-f1;if(f1){f2=fun[l1].length-f1;f1=0;}else if(f2){f2+=fun[l1].length;}else{f2=fun[l1].length;}l1--;}}//cout << "mid=" << mid << "sum1=" << sum1 << endl;return sum1;}int main(){int n,i,j,k,l,t2;int pos1,pos2,g;long long t1,sum,f1,f2,maxn;cin >> n;for(i=0;i<n;i++){cin >> m;memset(fun,0,sizeof(fun));maxn=0;for(k=0;k<m;k++){scanf("%d%lld",&t2,&t1);fun[k].length=t1;fun[k].a=t2+'0';}for(j=0;j<m;j++){sum=huiwen(fun,j);if(sum>maxn)maxn=sum;}cout << maxn << endl;}return 0;}

J 藏宝图*****************************************<记忆BFS>
Description
彩虹岛有一个神秘的地方,里面藏着无数的珍宝,这便是朝晖十四号楼。为了找到宝藏,无数勇士不惜
踏上了(女装)寻宝的不归路,其中也包括A在一次偶然中得到了一张藏宝图,已知藏
宝图上画着一个n*m迷宫,其中’S' 是迷宫的入口,’T’为宝藏的所在地,迷宫中还有很多扇门(在地图
上用’#’表示),所有的门都只会在t,2t,3t ... 时刻(k的倍数时刻)开启,门只有在开启的时刻可以被经

过。A每次可以在竖直或水平方向移动一步,并且不能选择停留在原地等待(如果无法移动则认为
不能到达藏宝地点)。在寻宝的过程中,他也不能走出迷宫边界。由于A太懒,他不想毫无准备贸然
闯入迷宫,他想预先知道他能否通过这个藏宝图走到宝藏所在地,如果可以,最少需要几步才能到达宝藏所
在地。
Input
输入第一行为一个整数T(T≤ 50),表示一共有T组测试数据。
对于每组测试数据:
第一行为三个整数n,m,t。
接下来n行每行m个字符表示大小为n× m的藏宝图。
其中’S’表示起点,’T’表示宝藏所在地,’#’表示门,’.’表示无障碍区域。
Output
对于每组测试数据:若能到达宝藏所在地,输出最少的步数;否则输出”-1”(不含引号)。
Sample Input
1
6 6 2
...S..
...#..
.#....
...#..
...#..
..#T#.
Sample Output
7

thinking:记忆的标记是标记已经经历过的状态,状态!状态。注意是状态,这里的状态是T%t相同是状态相同。

the reason of failure:

1、每组数据的结束都需要清空队列。

J 藏宝图Description彩虹岛有一个神秘的地方,里面藏着无数的珍宝,这便是朝晖十四号楼。为了找到宝藏,无数勇士不惜踏上了(女装)寻宝的不归路,其中也包括                                             
0 0
原创粉丝点击