1.
题目描述
小P最近人生得意,去参加了一次相亲大会,相亲大会上每个人有一个密码牌(密码牌上的密码是一个正整数m,m<231 ),相互之间在交流之前先交换密码牌,密码牌上的密码可能相同,也可能不同,如果相同,两人牵手离开,如果不保同,各自再寻找下一位,保证最后只有1个人或2个人留下来。
输入
第一行两个数 n,k (n≤3000000,1≤k≤2),n表示参加相亲大会的人数,接下来 n行每行一个正整数表示相亲大会上每一个人的密码,k表示最后留在相亲大会的人数。
输出
从小到大输出一行 k个数,表示相亲不成功留在相亲大会人的密码,中间用空格分隔。
看到题目首先想到的是凉凉两两配对,当然是相同的配对,所以自然而然地就想到了排序,但是怎么把相同的两个数给他想个办法隔过去呢?这又是一个新的问题,所以想如果两个相同就运用两次加加,具体看代码叭。
代码实现:
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long ll; 4 const int maxn=3e6+5; 5 int n,k; 6 int a[maxn]; 7 int main() 8 { int i; 9 scanf("%d%d",&n,&k); 10 for(i=0;i<n;i++) 11 scanf("%d",&a[i]); 12 sort(a,a+n); 13 int dis=k; 14 for(i=0;i<n;i++) 15 { 16 if(a[i]==a[i+1]) 17 i++; 18 else 19 { 20 printf("%d",a[i]); 21 dis--; 22 if(dis==0) return 0; 23 else if(dis==1) printf(" "); 24 } 25 } 26 return 0; 27 }
因为有限制了留下的人的数量,所以巧妙地利用一个参数来达到目的。
2.
小P最近在研究字符编码,给出一串由0、1组成的字符串,从中任意进行截取,如果截取的字符串对应一个英文字母的ASCII值,小P就把这个0、1串叫字母子串,问给定的字符串最多能截取出多少个字母子串。
输入
测试数据有多组,每组一行由0、1组成的字符串,每行长度不超过10000。
输出
对于每组输入,在一行中输出最多可以截取的字母子串的数量。
这道题比赛的时候当然没有做出来了,因为连题目都没看懂,所以,只能暗自神伤自己暗戳戳的下来研究了,结果我发现!!!c++对于字符串来说真是个好东西啊啊啊啊,用c写太麻烦了,于是借鉴了其他大佬的c++,结果发现真香!!!
这道题目就是截取七个字符判断其是不是字母范围内,如果不是指针后移1位,如果是指针后移6位,话不多说,上代码。
代码实现:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 int zh(string a) 6 { 7 int d=0; 8 for(int i=0;i<a.size();i++) 9 d=d*2+a[i]-'0'; 10 return d; 11 } 12 int main() 13 { string a,b; 14 int i; 15 while(cin>>a) 16 { 17 int sum=0,num=0; 18 for(i=0;i+6<a.size();i++) 19 { 20 string c=a.substr(i,7);//从i开始截七个字符组成一个串。 21 num=zh(c); 22 if(num>=65&&num<=90||num>=97&&num<=122) 23 { 24 sum++;i=i+6; 25 } 26 27 } 28 cout<<sum<<endl; 29 } 30 31 return 0; 32 } 33