A-化学 烷烃基类别甄别
题意:
给定随机编号代表原子编号,
输入5行表示两两编号之间存在化学键
然后输出烷烃基种类
我的笨思路:
根据输入信息很容易得到每个原子分别参与多少个化学键的组成,
根剧化学键的组成情况可区分出除 "3-methylpentane"和"2-methylpentane"之外的烷烃基
但是由于编号的无序性,剩下的两种按照这种思路难以解决下去,其实这种刻画不能体现其本质的特征
经过思考,可以发现其化学键的内在逻辑是固定的,然不想重写。。
剩下的含三个键的与其相邻的原子们的化学键组成是不一样的!
前面的思路代码已经成形,后期只得在前面思路的基础上做了修补,勉强解决了本题。
#include<iostream>
#include<algorithm>
using namespace std;
int jian(int k,int s[][2]){
int sum=0;
for(int i=0;i<5;i++){
if(k==s[i][0]||k==s[i][1])
sum++;
};
return sum;//计算编号为K的原子的化学键数
}
int main(){
int n;cin>>n;
while(n--){
int s[5][2];
int *num=new int[6];
for(int i=0;i<6;i++) num[i]=0;
for(int i=0;i<5;i++)
{
cin>>s[i][0]>>s[i][1];
num[s[i][0]-1]++;
num[s[i][1]-1]++;
}
int index=0;
for(int i=0;i<6;i++)
if(num[i]==3)
index=i;
sort(num,num+6);//按照化学键数排序
if(num[5]==4)
cout<<"2,2-dimethylbutane"<<endl;
else if(num[5]==2)
cout<<"n-hexane"<<endl;
else if(num[5]==3){
if(num[4]==3)
cout<<"2,3-dimethylbutane"<<endl;
else {
int sum=0;
for(int i=0;i<5;i++)
{ //计算出与含三个化学键相邻的原子的化学键总数
if(s[i][0]==index+1)
sum+=jian(s[i][1],s);
else if(s[i][1]==index+1)
sum+=jian(s[i][0],s);
}
if(sum==4)//2+1+1
cout<<"2-methylpentane"<<endl;
else if(sum==5)//2+2+1
cout<<"3-methylpentane"<<endl;
}
}
}
return 0;
}
反思:
遇到问题不能稍微有一点思路就瞎写, 还是要多多思考,尤其这种模拟题,要抓住数据的内在联系的本质。
如在本题中,键的位置关系是决定了烷烃基的本质。
B-考试排名
Input
输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。
Output
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。
题目涉及的数据类型
/*标记 负数 提交次数 not AC
正数 AC耗时 AC
a(b) 耗时(错误次数) AC
!!!其中time在AC的里面算
*/
Sample Input
8 20
GuGuDong 96 -3 40(3) 0 0 1 -8 0
hrz 107 67 -3 0 0 82 0 0
TT 120(3) 30 10(1) -3 0 47 21(2) -2
OMRailgun 0 -99 -8 0 -666 -10086 0 -9999996
yjq -2 37(2) 13 -1 0 113(2) 79(1) -1
Zjm 0 0 57(5) 0 0 99(3) -7 0
Sample output
TT 5 348
yjq 4 342
GuGuDong 3 197
hrz 3 256
Zjm 2 316
OMRailgun 0 0
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iomanip>
using namespace std;
const int max=100010;
typedef struct inf{
string name;
int ac;
int time; //罚时
//string grade[n];
}inf;
bool cmp(inf t1,inf t2){
if(t1.ac!=t2.ac)
return t1.ac>t2.ac;//ac数降序
if(t1.time!=t2.time)
return t1.time<t2.time;//时间升序
return t1.name<t2.name;//姓名字典序升序
}
int main(){
int n,m;
cin>>n>>m;
题目涉及的数据类型
/*标记 负数 提交次数 not AC
正数 AC耗时 AC
a(b) 耗时(错误次数) AC
!!!其中time在AC的里面算
*/
//inf *mes=new inf[max];
inf mes[100010];
//memset(mes,0,sizeof(inf));
int j=0;
//输入并处理
//while(scanf("%s", &(mes[j].name[0]))!=EOF){
while(cin>>mes[j].name){
int nopass=0,thetime=0;
for(int i=0;i<n;i++)
{
string str;
//scanf("%s",&str[0]);
cin>>str;
//判断字符串类型
if(str[0]=='-'||str[0]=='0')
nopass++;//以‘-’或者‘0’开头的表示没有ac
else if(str[str.length()-1]==')')//判断是否是括号?
{
mes[j].time +=atoi(str.c_str());//自动把( 前面的转化为整型的时间
int t;
for(t=0;t<str.length();t++){
if(str[t]=='(')
break;
}
t++;//找到( 把括号内的错误提交计算出来
int wrong=0;
while(str[t]!=')'){
wrong*=10;
wrong+= str[t]-'0';
t++;
}
mes[j].time+=wrong*m; //加权重计算罚时
}
else {
//一次ac耗时 直接计算罚时即可
mes[j].time += atoi(str.c_str()) ;
}
}
mes[j].ac=n-nopass;//总题数目-未通过的数目
//cout<<mes[j].name<<endl;
j++;
}
//排序
sort(mes,mes+j,cmp);
for(int i=0;i<j;i++){
cout<<setw(10)<<setiosflags(ios::left)<<mes[i].name<<" "<<setw(2)<<setiosflags(ios::right)<<mes[i].ac<<" "<<setw(4)<<setiosflags(ios::right)<<mes[i].time<<endl;
cout.setf(ios::left,ios::right);//每次要把默认右对齐改为左对齐!!ps.这种格式练得少要注意总结。。。
}
return 0;
}
okkkkkk
C-模拟打牌
题意:
North
West East
South
52张牌,指定发牌员,从下一个人开始顺时针发牌,对每个玩家手中的牌进行排序并输出
这道模拟题看起来比较麻烦,不妨慢慢看怎么一步一步处理
1.数据的表示:
【牌】对于每一张牌,我们既要大小,又要花色,很直观的就想到用结构体或者二维数组来表示,
由于 后面涉及到排序,我们把它当做一个不可分割的单位,用结构体就比较好(可能数组也行。。不太会,行列指针可以应该)!
处理好牌的表示问题,我们很自然地就可以把每个人手中的牌用结构体数组来存储表示了
2.数据输入:
我们先不妨不要管是谁发牌的,先把牌发下去分好类,存进不同的结构体内。
3.数据处理(排序)
排序先按照花色排序,再按照大小排序(小技巧)
由于花色 c <d <s< h 这样的指标不好衡量,所以 我们可以偷偷地先把他们替换为升序的其他字符,,或者1 2 3 4 排序后还原即可
我还写了一堆if else。。。。太复杂了。。emmmm 写完看了下,我的代码居然还是if else..懒得改了哎
同样的对于“大小”,大于9的我们也做替换,便于排序,排序完成后在还原成原来的就好了。。(我是到了这里才回头的)
4.输出
对玩家的输出顺序是固定的,那么我们现在可以根据输入的发牌的人判断存储的对应关系,依次输出
可以找规律输出,但是就四种情况,最后实在思考不动了索性if else裸输出了。。
Input:
输入包含多组数据
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。
Output
输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。
Sample Input and Output
Sample Input
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#
Sample Output
South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
AC Code
1 #include<iostream>
2 #include<string>
3 #include<algorithm>
4 using namespace std;
5 #include<map>
6 //char dir[4]={'N','E','S','W'};
7 //花色: C梅花<D方片<S黑桃<H红桃
8 //大小: 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A
9 //map<char,int> no={{}}
10 //{{"C",1},{"D",2},{"S",3},{"H",4} };
11
12 //T a; J b;Q c;K d;A e
13 typedef struct card{
14 char color;
15 char num;
16 }card;
17 bool cmp(card c1,card c2){
18 if(c1.color=='C'){
19 if(c2.color=='C'){
20 //判断数码大小
21 return c1.num<c2.num;
22 }
23 else
24 return true;
25 }else if(c1.color=='D'){
26
27 if(c2.color=='C')
28 return false;
29 else if(c2.color=='D'){
30 //判断数码大小
31 return c1.num<c2.num;
32 }
33 else
34 return true;
35 }
36 else if(c1.color=='S') {
37 if(c2.color=='H')
38 return true;
39 else if(c2.color=='S')
40 //判断大小
41 return c1.num<c2.num;
42 else
43 return false;
44 }
45 else { if(c2.color=='H')
46 //判断数码大小
47 return c1.num<c2.num;
48 else
49 return false;
50 }
51
52 }
53 void print(card per[][13]){
54 for(int i=0;i<4;i++)
55 {
56 for(int j=0;j<13;j++)
57 cout<<per[i][j].color<<per[i][j].num<<" ";
58 cout<<endl;
59 }
60 } /*
61 |6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
62 | C | C | D | D | S | S | S | S | H | H | H | H | H |
63 |6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
64 +---+---+---+---+---+---+---+---+---+---+---+---+---+
65 */
66 void print_each(card per[][13],int row){
67 //first line
68 cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
69 //second line
70 for(int i=0;i<13;i++){
71 cout<<"|"<<per[row][i].num<<" "<<per[row][i].num;
72 }
73 cout<<"|"<<endl;
74
75 //third line
76 for(int i=0;i<13;i++){
77 cout<<"| "<<per[row][i].color<<" ";
78 }
79 cout<<"|"<<endl;
80
81 //fourth line
82 for(int i=0;i<13;i++){
83 cout<<"|"<<per[row][i].num<<" "<<per[row][i].num;
84 }
85 cout<<"|"<<endl;
86
87 //fifth line
88 cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
89
90 }
91 int main(){
92
93 //string s1,s2,s3,s4,s5;cin>>s1>>s2>>s3>>s4>>s5;
94
95 char offer;
96 cin>>offer;
97 string str,str1;
98 //string per[4];
99 card per[4][13];
100 while(offer!='#')
101 {
102 cin>>str>>str1;
103 str.append(str1);
104 //两个字母一组
105 //string color;
106 //string num;
107 for(int i=0,j=0;i<str.length();i+=2,j++){
108 per[j%4][j/4].color = str[i];
109 per[j%4][j/4].num = str[i+1];
110 //if(j&&j%4==0)
111 // k++;
112 if(per[j%4][j/4].num=='T') //转换后便于比较
113 per[j%4][j/4].num='a';
114 else if(per[j%4][j/4].num=='J')
115 per[j%4][j/4].num='b';
116 else if(per[j%4][j/4].num=='Q')
117 per[j%4][j/4].num='c';
118 else if(per[j%4][j/4].num=='K')
119 per[j%4][j/4].num='d';
120 else if(per[j%4][j/4].num=='A')
121 per[j%4][j/4].num='e';
122 }
123 //print(per);
124 for(int i=0;i<4;i++){ //排序
125 sort(per[i],per[i]+13,cmp);
126 for(int j=0;j<13;j++){ //变换回去
127 if(per[i][j].num=='a')
128 per[i][j].num='T';
129 if(per[i][j].num=='b')
130 per[i][j].num='J';
131 if(per[i][j].num=='c')
132 per[i][j].num='Q';
133 if(per[i][j].num=='d')
134 per[i][j].num='K';
135 if(per[i][j].num=='e')
136 per[i][j].num='A';
137 }
138 }
139 //NESW
140 //offer->next==per[0]
141 if(offer=='N'){
142 cout<<"South player:"<<endl;
143 print_each(per,1);
144 cout<<"West player:"<<endl;
145 print_each(per,2);
146 cout<<"North player:"<<endl;
147 print_each(per,3);
148 cout<<"East player:"<<endl;
149 print_each(per,0);
150 }
151 else if(offer=='E') {
152 cout<<"South player:"<<endl;
153 print_each(per,0);
154 cout<<"West player:"<<endl;
155 print_each(per,1);
156 cout<<"North player:"<<endl;
157 print_each(per,2);
158 cout<<"East player:"<<endl;
159 print_each(per,3);
160 }
161
162 else if(offer=='S'){
163 cout<<"South player:"<<endl;
164 print_each(per,3);
165 cout<<"West player:"<<endl;
166 print_each(per,0);
167 cout<<"North player:"<<endl;
168 print_each(per,1);
169 cout<<"East player:"<<endl;
170 print_each(per,2);
171 }
172
173 else if(offer=='W'){
174 cout<<"South player:"<<endl;
175 print_each(per,2);
176 cout<<"West player:"<<endl;
177 print_each(per,3);
178 cout<<"North player:"<<endl;
179 print_each(per,0);
180 cout<<"East player:"<<endl;
181 print_each(per,1);
182 }
183 cout<<endl;
184 cin>>offer;
185 }
186 //cout<<str<<endl;
187 //print(per);
188
189 return 0;
190 }
小小三道模拟,头疼 ,咳咳。。