三道小小模拟

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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
 
View Code

 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 }

小小三道模拟,头疼 ,咳咳。。

流转星云
原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12423300.html