没事做一下。
A:给定一个初始的玩具,有两种机器,①投入这个玩具,可以额外生成以个玩具和一个复制品(原来的玩具不会消失),②投入一个复制品,生成额外的两个复制品(原来的复制品也不会消失)
给你最后的玩具数目和复制品数目,问你最后能否生成。
思路:这种题还是要想明白再写,不然wa个好几发整的也挺尴尬的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{ ll m,n;
cin>>m>>n;
if(n==1&&m==0){
puts("YES");//特殊情况
}
else if(n>1&&(m-n+1)>=0&&(m-n+1)%2==0){
puts("YES");//玩具一定要大于1.
}
else
puts("NO");
return 0;
}
B:三个数在[1,n]之间,且三者异或为0.问着三个数有多少种。
数据范围很小暴力
#include <bits/stdc++.h>
using namespace std;
map<pair<int,pair<int,int> >,bool >mp;
int main()
{ ios::sync_with_stdio(false);
int m;
cin>>m;
int ans=0;
//mp.clear();
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j++){
int s=i^j;
if(s>=1&&s<=m){
if(i+j>s&&i+s>j&&j+s>i){
//cout<<i<<" "<<j<<" "<<s<<endl;
ans++;
}
}
}
}
cout<<ans/3<<endl;
return 0;
}
c 给定1-n个数,求每个数m%i的结果是否都不一样。
数据范围 1e18
思路:没有写,毕竟是1e18啊。。 后来看别人的代码,直接暴力就过。。
设想 i为1, 结果比为0
为2 结果必为 0 或者1(而如果是0就break了)。
为3 结果可为 0 1 2 (是0,1就break)
所以这题就是说有很高的概率break。实际上限应该非常低非常低。 。
n modi 就是n%i ,我开始还整反了。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll m,n;
map<ll,bool>mp;
int main()
{ scanf("%lld%lld",&m,&n);
bool flag=false;
for(int i=1;i<=n&&!flag;i++){
ll s=m%i;
if(mp[s])flag=true;
mp[s]=true;
}
puts(flag?"No":"YES");
return 0;
}
D:给你n个串由 s和h组成,问你如何排列他们能使 sh子序列最多,输出这个数目。
思路:贪心,按s的比例。。这个我也没想到。
#include <bits/stdc++.h>
using namespace std;
/*
*/
const int maxn=1e5+5;
typedef long long ll;
struct Node{
string s;
double bl;
}nod[maxn];
bool cmp2(Node a,Node b){
return a.bl>b.bl;
}
int main()
{ ios::sync_with_stdio(false);
int m;
while(cin>>m){
ll ans=0;
for(int i=0;i<m;i++){
cin>>nod[i].s;
int num=0;
for(int j=0;j<nod[i].s.length();j++){
if(nod[i].s[j]=='s') num++;
else ans++;
}
int len=nod[i].s.length();
nod[i].bl=(1.0*num)/(1.0*len);
}
sort(nod,nod+m,cmp2);
ll sum=0;
//cout<<ans<<"!!"<<endl;
for(int i=0;i<m;i++){
for(int j=0;j<nod[i].s.length();j++){
if(nod[i].s[j]=='s'){sum+=ans;
// cout<<i<<" "<<nod[i].s<<endl;
}
else ans--;
}
}
printf("%lld\n",sum);
}
return 0;
}
E是个 背包。等等再写。