http://codeforces.com/contest/864
A。
比赛前两个人拿两张牌,不能相同的数字,然后比赛后这个牌堆中与他们手中数字相同的都是他们的牌。问他们俩可否拿走所有牌。
就是看是否一个是否 存在两种数,且数量相等均为N/2
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int map1[106];
int fir[2];
int main()
{ int n,a;
while(~scanf("%d",&n)){
memset(map1,0,sizeof(map1));
int siz=0;
for(int i=0;i<n;i++){
scanf("%d",&a);
if(!map1[a]){
map1[a]++;
//siz++;
fir[siz++]=a;
}
else
map1[a]++;
}
if(siz==2&&map1[fir[0]]==map1[fir[1]])
{puts("YES");
printf("%d %d\n",fir[0],fir[1]);
}
else
printf("NO");
}
return 0;
}
2 要求你输出 一组小写字母。
① 每种小写字母只输出一个。
② 输出的小写字母之间不能有 大写字母。
思路:遇到大写的就置0,否则就记录。
#include <bits/stdc++.h>
using namespace std;
string s;
int m;
bool vis[30];
vector<char>q;
int main()
{ while(cin>>m>>s){
q.clear();
int ans=-1;
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='Z'){
ans=max((int)q.size(),ans);
q.clear(),memset(vis,false,sizeof(vis));
}
else if(s[i]>='a'&&s[i]<='z')
{ if(!vis[s[i]-'a']){
vis[s[i]-'a']=true;
q.push_back(s[i]);
}
ans=max((int)q.size(),ans);
}
}
printf("%d\n",ans);
}
return 0;
}
3 给定一段马路(x轴,从0开始)。长度为a,里面油料为b,加油站再f处(1,f),这条路循环走m次。
问你最少的加油次数。
模拟。。其实没有那么难。。。
先看走后一步油够不够,如果不够就加。不然就不加。
#include <bits/stdc++.h>
using namespace std;
/*模拟,贪心。
因为这条路是有循环的。
*/
int a,b,f,k;
int main() {
while(~scanf("%d%d%d%d", &a, &b, &f, &k)){
int fuel=b;
int ans=0;
bool flag=false;
//fuel-=b;
while(k--){
fuel-=f;
if(fuel<0){
puts("-1");flag=true;
}
f=a-f;
if(fuel<2*f&&k){
fuel=b;ans++;
}
else if(fuel<f&&k==0){
fuel=b;ans++;
}
fuel-=f;
if(fuel<0){
puts("-1");flag=true;
}
if(flag)break;
}
if(!flag)
printf("%d\n",ans);
}
return 0;
}
4 5 再补。