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 }
小小三道模拟,头疼 ,咳咳。。