4.7牛客校ACM选拔赛
A题
知识点:
任何数都是0的因数
0和0的公因数是0
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a,b;cin>>a>>b;
cout<<a+b;
return 0;
}
B题
我研究出来一个公式,万物均可用字母来找等量关系,列方程试试
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a,b;cin>>a>>b;
for(int i=1;i<=(b-a);i++)
{
if((b-a)%i==0&&i>a)
{
cout<<i-a;
return 0;
}
}
cout<<-1;
return 0;
}
C题
前缀和直接搞
我代码屎山了....贴个韩顺哥的代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(nullptr);
string s;cin>>s;
int arr[100003][10]={0};
for(int i=1;i<s.size()+1;i++)
{
arr[i][s[i-1]-'0']++;
if(i<s.size()+1)
{
arr[i+1][0]=arr[i][0];
arr[i+1][1]=arr[i][1];
arr[i+1][2]=arr[i][2];
arr[i+1][3]=arr[i][3];
arr[i+1][4]=arr[i][4];
arr[i+1][5]=arr[i][5];
arr[i+1][6]=arr[i][6];
arr[i+1][7]=arr[i][7];
arr[i+1][8]=arr[i][8];
arr[i+1][9]=arr[i][9];
}
}
// for(int i=1;i<s.size()+1;i++)
// {
//
//
//
// for(int j=0;j<10;j++)
// {
// cout<<arr[i][j]<<' ';
// }
// cout<<endl;
// }
int ans=0;
for(int l=0;l<s.size();l++)
{
for(int r=l+1;r<s.size()+1;r++)
{
if(!(arr[r][0]-arr[l][0])&&arr[r][1]-arr[l][1]<=1&&arr[r][2]-arr[l][2]<=2&&arr[r][3]-arr[l][3]<=3&&arr[r][4]-arr[l][4]<=4&&arr[r][5]-arr[l][5]<=5&&arr[r][6]-arr[l][6]<=6&&arr[r][7]-arr[l][7]<=7&&arr[r][8]-arr[l][8]<=8&&arr[r][9]-arr[l][9]<=9)
ans++;
else
break;
}
}
cout<<ans<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int long long
void solve() {
string s;cin>>s;
int ans=0;
vector<int> cnt(10);
for(int l=0,r=0;r<s.size();r++){
cnt[s[r]-'0']++;
while(cnt[s[r]-'0']>s[r]-'0'){ //因为只有发生数量变化的数字才需要检验,其他的不需要再次检验,因为没变
cnt[s[l]-'0']--;//l去追r,会一直追到不满足条件,既然不满足了,后面r再往右,也不会和前面的组成符合条件的字符串
l++;//所以l可以++后停在那
}
ans+=r-l+1;
}
cout<<ans<<"\n";
}
signed main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
int t = 1;//std::cin >> t;
while (t--) solve();
return 0;
}
D题
就是找规律,规律就在素数上....(气炸了,考完两分钟出来了)
以后我代码写的再这么不严谨.....
尤其是字母,数字别写错!边界问题仔细举例模拟试试
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int a;cin>>a;
if(a==0)
{
cout<<0;
return 0;
}
if(a==1)
{
cout<<1;
return 0;
}
if(a==2)
{
cout<<2;
return 0;
}
if(a==3)
{
cout<<2;
return 0;
}
int ans=0;
for(int i=2;i<=(int)sqrt(a+1)+2;i++)
{
if((a+1)%i==0)
ans=1;
}
if(ans==0)
cout<<a;
else
cout<<0;
return 0;
}
E题
题意:你有n种货币,老板也有n种,每种货币都是无限个。有几个商品,看你能不能买他,但是你付钱了,得让老板有的找,他要是找不了,那就不能买了。
思路:
初步思路:通过n个货币的拼凑,加减。把下面的值给凑出来
离散数学公式:gcd(a1,a2,a3,⋯,an)∣d⇔a1x1+a2x2+a3x3+⋯+anxn=d
n个数的最大公因数,如果这个数能被下面的数整除,那么下面这个数就可以通过n个数的拼凑得到
(0和任何数的最大公因数都是另一个数本身)
函数:
__gcd(x,y) //可以求最大公因数,但是不能用浮点型
//在C++17,不需要写前缀__了。gcd即可
//就不用再写其原型了:
int gcd(int a,int b) {
return b>0 ? gcd(b,a%b):a;
}
//没有直接求最小公倍数的函数
//但是,两数乘积除以最大公约数就是最小公倍数
实现:
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n,m,sum=0,_t=0;
cin>>n>>m;
vector<int>v(n+1);
vector<int>v1(m+1);
for(int i=1;i<=n;i++){
cin>>v[i];
sum=__gcd(sum,v[i]);
}
for(int i=1;i<=m;i++){
cin>>v1[i];
}
int sum1=0,tt=0;
if(sum==1){
cout<<0<<endl;
return 0;
}
for(int i=1;i<=m;i++){
if(v1[i]%sum!=0){
sum1++;
}
}
cout<<sum1<<endl;
}
F题
题意:先给你一个a数组,然后输出b数组,b3,这个3经过2进制反转后,那个数字就是在a数组中对应的下标,输出这个下标对应的值即可
思路:
所以关键就是反转。
纯暴力即可,给你一个数组,把0到n,都反转一下,然后按顺序输出(在a中的位置)
如何反转:
右移到某一位,和1进行&,该位数字和1相&,若是1就是1,若是0就是0。至于前面的位数,由于下面都是0,所以结果都是0。(全真才真)
实现:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[1 << 21], p[1 << 21];
int t = 0;
int cal(int x) {//x是从0到8 就是每个数字的下标
int num = 0;
vector<int> tmp;
for (int j = t - 2; j >= 0; j --) {//t是一共多少次幂
tmp.push_back((x >> j) & 1);//
}
int c = 0;
for (auto t : tmp) {
if (t) {
num += (1 << c);
}
c ++;
}
return num;
}
signed main(){
cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
cin >> n;//n个数字
for (int i = 0; i < n; i ++) {
cin >> a[i];//输入a数组
}
int tmp = n;
while (tmp) {
tmp >>= 1;//除以2
t ++;//看这个n是2的几次幂
}
for (int i = 0; i < n; i ++) {
p[i] = cal(i);//从0到8?
}
for (int i = 0; i < n; i ++) {
cout << a[p[i]] << ' ';
}
cout << endl;
return 0;
}

浙公网安备 33010602011771号