A.妙手
题目大意:
思路:
代码:
B.宝石
题目大意:
思路:
代码:
C.斩龙
题目大意:
思路:
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a1,h1,a2,h2,x,a3,h3,k;
cin>>a1>>h1>>a2>>h2>>x>>k>>a3>>h3;
int at1=h2/a1+1;
int at2=h3/a1+1;
h1-=(h2/a1)*x;
int sum=at1*(x-k);
h1-=(k+at1)*a3;
sum+=k*at1+at2;
if(h1<=0) cout<<"No Franxx!";
else{
cout<<sum;
}
}
D.数对
题目大意:
思路:
代码:
E.双星
题目大意:
思路:
代码:
F.手办
题目大意:
1-n个手办,求编号为x的手办有多少个(x为n的约数,并且x的2/3次方为有理数)
T组测试数据,输入n
思路:
每个质因数都需要是三次幂,因为平方对三次幂是没有贡献的,原本不是3的倍数,平方之后依旧不是
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
int main(){
ios::sync_with_stdio(false);
int n,i,t;
cin>>t;
while(t--){
cin>>n;
int ans=1;
for(i=2;i<=1000;i++){
int num=i*i*i;
if(num>n)break;
if(n%num==0) ans++;
}
cout<<ans<<endl;
}
return 0;
}
G.无限
题目大意:
给定一个无限集合,已知集合中存在一个1,集合中元素满足以下性质:
- 如果x在无限集合中,那么 x×4也在无限集合中。
- 如果x在无限集合中,那么 x×2+1也在无限集合中。
问:给定一个正整数p,求无限集合中小于2的p次方的数的个数(对 998244353取模)。
思路:
看到这道题的第一眼,这玩意儿绝对有规律,于是自己试了一下
1 2 3 4 5.....
1 2 4 7 11......
这不就f[i] = (f[i - 1] + f[i - 2] + 1) % mod;
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
int f[N];
int n;
int main(){
cin >> n;
f[1] = 1;
f[2] = 2;
for(int i = 3; i < N; i ++){
f[i] = (f[i - 1] + f[i - 2] + 1) % mod;
}
cout << f[n] << endl;
return 0;
}
H.0和1
题目大意:
思路:
代码:
I.22数
题目大意:
思路:
代码:
J.签到
题目大意:
在数组找出(可重复)a+b+c=d的数的个数
思路:
思路1:
类似于洛谷的a-b数对,当时就是想到了这个题
思路2:
是自己的方法,方法一想到了没写出来。
a+b+c=d转化为a+b=c-d
分别求出所有的a+b与c-d存到vector中,二分进行比较(直接比较会超时)
不可存到set里面,因为set的insert()函数的时间复杂度为O(logN),而vector的puch_back()函数时间复杂度为O(1)
代码:
方法1:
#include <bits/stdc++.h>
using namespace std;
int n,a[1e3+7];
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
map<int,bool> mp;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[a[i]+a[j]]=1;
}
}
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[a[i]-a[j]]){
flag=1;
break;
}
}
if(flag) break;
}
if(flag) cout<<"Yes\n";
else cout<<"No\n";
return 0;
}
方法2:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
int n,a[1010];
vector<ll> v1,v2;
int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
v1.push_back(a[i]+a[j]);
v2.push_back(abs(a[i]-a[j]));
}
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
// for(int i=0;i<v1.size();i++){
// cout<<v1[i]<<" ";
// }
// cout<<endl;
// for(int i=0;i<v2.size();i++){
// cout<<v2[i]<<" ";
// }
// cout<<endl;
int len=v1.size();
for(int i=0;i<len;i++){
int aa=binary_search(v2.begin(),v2.end(),v1[i]);
if(aa==1){
cout<<"Yes"<<endl;
return 0;
}
}
cout<<"No"<<endl;
return 0;
}
K.大米
题目大意:
思路:
代码:
L.HPU
题目大意:
从一串字符串中找到HPU,并输出个数
思路:
查找子串在主串中个数,直接把之前写过的稍微改动复制了一下。
代码:
#include<stdio.h>
#include<string.h>
int next[100];
void getNext(char ptn[],int next[])
{
int len = strlen(ptn);
next[0] = -1; //下标0处的初始化
int k = -1;
int j = 0;
while(j<len) //get_next函数进行升级的点:这里不是j<len-1 而是j<len,这样能够不回溯计数
{
if(k == -1 || ptn[k] == ptn[j])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int kmp(char src[],char ptn[])
{
int len_src = strlen(src);
int len_ptn = strlen(ptn);
int i = 0,n = 0,k = 0; //k应该从0开始,而非-1
while(i<len_src)
{
if(k==-1||src[i]==ptn[k])
{
++i;
++k;
}
else
{
k=next[k];
}
if(k==len_ptn){ //实现不回溯计数
n++;
k = next[k];
}
}
return n;
}
int main()
{
char src[10000010],ptn[4]="HPU";
scanf("%s",&src);
getNext(ptn,next);
printf("%d",kmp(src,ptn));
}