图片说明

  • 题意:
  • 给出一个数,每次操作,如果可以除以2就除以2,如果可以除以3就除以3再乘2,如果可以除以5就除以5再乘4
  • 题解:
  • 模拟呗
  • 代码:
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    int main()
    {
      ll t,n;
      cin>>t;
      while(t--)
      {
          cin>>n;
          ll k1=0,k2=0,k3=0;
          while(n%2 == 0){
              n/=2;
              k1++;
          }
          while(n%3 == 0){
              n/=3;
              k2++;
          }
          while(n%5 == 0){
              n/=5;
              k3++;
          }
          if(n == 1){
              cout<<k1+2*k2+3*k3<<endl;
              continue;
          }
          cout<<"-1"<<endl;
      }
      return 0;
    }

图片说明
图片说明

题意:
给出一段数组,问你最少减少多少个数可以使得这个数组成为[4,8,15,16,23,42]组成的数组。
题解:
从4开始,如果有4就往后看又没有8,然后看有没有15.16.....
总共看有多少个
代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
map<int,int> mp;
int n,k;
int ans[100]={0};
int main()
{
    mp[4]=1,mp[8]=2,mp[15]=3,mp[16]=4,mp[23]=5,mp[42]=6;
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d",&k);
        if(mp[k] == 1){
            ans[1]++;
        }
        else if(ans[mp[k]-1] > 0){
            ans[mp[k]-1]--;
            ans[mp[k]]++;
        }
    }
    //cout<<ans[6]<<endl;
    cout<<n-6*ans[6]<<endl;
    return 0;
}

图片说明
图片说明
题意:
给出一个无向图,n个点和m条边,问你最多选择n/2个点使得每个没有被选到的点都能连着被选到的点,输出选择的点。
题解:
直接染色就行了呗,染白色和黑色,颜色少的肯定小于等于n/2
代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 2e5+10;
vector<int> v[maxx];
int n,k,cnt0=0,cnt1=0;
int color[maxx],flag[maxx];
void dfs(int x,int sign)
{
    if(sign){
        cnt1++;
    }else{
        cnt0++;
    }
    color[x] = sign;
    for(int i=0;i<v[x].size();i++){
        if(!flag[v[x][i]]){
            flag[v[x][i]] = 1;
            dfs(v[x][i],sign^1);
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {

        int n,m,x,y;
        cnt0 = cnt1 = 0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            flag[x] = flag[y] = 0;
            v[x].push_back(y),v[y].push_back(x);
        }
        flag[1] = 1;
        dfs(1,0);
        if(cnt0 > cnt1){
            cout<<cnt1<<endl;
            for(int i=1;i<=n;i++){
                if(color[i]){
                    cout<<i<<" ";
                }
            }
            cout<<endl;
        }else{
            cout<<cnt0<<endl;
            for(int i=1;i<=n;i++){
                if(!color[i]){
                    cout<<i<<" ";
                }
            }
            cout<<endl;
        }
    }
    return 0;
}