A Generous Kefa
题目大意:
一共有n个物品,k个人。每一个物品都有自己的颜色,颜色相同意味着同一件物品。现在要把所有的物品分出去,如果有人拿到了相同的物品就会不高兴。问是否存在方案使得每一个人都高兴?
大致思路:
给每一个物品开一个桶,然后按照顺序把物品放到桶里,最后扫一遍桶,如果有桶里物品的数目大于人数,那么根据抽屉原理可以知道必然有有人会拿到相同的物品
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int button[26]; 7 int n,k; 8 char color[110]; 9 memset(button,0,sizeof(button)); 10 cin>>n>>k; 11 cin>>color; 12 for(int i=0;i<n;++i) 13 button[color[i]-‘a‘]++; 14 bool flag=true; 15 for(int i=0;i<26;++i) 16 if(button[i]>k){ 17 flag=false; 18 break; 19 } 20 if(flag) 21 cout<<"YES"<<endl; 22 else 23 cout<<"NO"<<endl; 24 return 0; 25 }
B Godsend
题目大意:
第一个人能够拿走和为奇数的序列,第二个人能够拿走和为偶数的序列,如果轮到某人时发现序列已为空,或者没有能拿走的序列,则另一个人获胜。现在给你一个序列,问如果两个人都足够聪明,那么谁必将获胜。
大致思路:
仔细思考整个过程,可以发现;
一旦整个序列和为奇数,则第一个人可以直接把整个序列拿走然后获得胜利。所以当序列中存在奇数时,如果和是奇数则第一个人直接胜利,若是偶数,则拿走和为奇数的序列。剩下和为奇数的序列,无论第二个人怎么拿,都不会改变整个序列和的奇偶性,第一个人第二次拿的时候必定能把序列全部拿完从而获得胜利。
所以,只要序列中存在奇数,则第一个人获胜。若不存在,则第二个人获胜。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int n,a; 7 bool flag=false; 8 cin>>n; 9 for(int i=0;i<n;++i){ 10 cin>>a; 11 if(a%2) 12 flag=true; 13 } 14 if(flag) 15 cout<<"First"<<endl; 16 else 17 cout<<"Second"<<endl; 18 return 0; 19 }
C Leha and Function
这个题我纯粹看样例答案猜规律的,没想到真猜出来了,就不写思路和大意了。
发现的规律如下:比如下面序列中某一个数在下面序列中排第K个,则对应上面的序列按大小排序后的第N-K个。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+7; 4 int a[maxn],ans[maxn]; 5 struct node{ 6 int v,id; 7 }b[maxn]; 8 bool cmp(node a,node b) 9 { 10 return a.v>b.v; 11 } 12 int main() 13 { 14 ios::sync_with_stdio(false); 15 int n,pos; 16 cin>>n; 17 for(int i=0;i<n;++i) 18 cin>>a[i]; 19 for(int i=0;i<n;++i){ 20 cin>>b[i].v; 21 b[i].id=i; 22 } 23 sort(a,a+n); 24 sort(b,b+n,cmp); 25 for(int i=0;i<n;++i){ 26 pos=b[i].id; 27 ans[pos]=a[i]; 28 } 29 for(int i=0;i<n;++i){ 30 if(i) 31 cout<<" "; 32 cout<<ans[i]; 33 } 34 cout<<endl; 35 return 0; 36 }
时间: 2024-10-06 21:20:49