SMU Summer 2024 Contest Round 4

1.H and V

原题链接:

http://162.14.124.219/contest/1008/problem/B

二进制枚举行列即可

查看代码
#include <bits/stdc++.h>
#define int long long
#define PII pair<int,int>
using namespace std;
int n,m,k;
char a[10][10];
signed  main() {
    ios::sync_with_stdio(false);cin.tie(0);
  	cin>>n>>m>>k;
  	int sum=0;
  	for(int i=0;i<n;++i){
  		for(int j=0;j<m;++j){
  			cin>>a[i][j];
  			if(a[i][j]=='#') sum++;
  		}
  	}

  	int cnt=0;
  	int ans=0;
  	 for(int i=0;i<(1<<n);++i){
  	 	for(int j=0;j<(1<<m);++j){
  	 		cnt=0;
  	 		for(int r=0;r<n;++r){
  	 			for(int c=0;c<m;++c){
  	 				if( ((i&(1<<r)) || (j&(1<<c)))&& a[r][c]=='#') cnt++;
  	 			} 
  	 		}
  	 		if(cnt==sum-k) ans++;
  	 	}
  	 }

  	 cout<<ans<<endl;

    return 0;
}

2.Moving Piece

原题链接:

http://162.14.124.219/contest/1008/problem/C

查找循环节并存入ve中,并贪心取最优

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5 + 9;
int Pp[maxn],Cc[maxn],mp[5009];
int a[maxn],sum[maxn];
vector<int>ve[5009];
signed  main()
{
    int n,k;
    int x;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        Pp[i]=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        Cc[i]=x;
    }
    int ans=-1e18;
    for(int i=1;i<=n;i++)
    {
        int now=i;
       memset(mp,0,sizeof mp);
        while(1)
        {
            now=Pp[now];
            if(mp[now]==1) break;
            mp[now]=1;
            sum[i]+=Cc[now];
            ve[i].push_back(Cc[now]);
        }
        int len=ve[i].size();
        int d=k/len;
        int m=k%len;
        now=0;
        if(sum[i]>0)
        {
            if(m==0)
            {
                now=(d-1)*sum[i];
                m=len;
            }
            else now=d*sum[i];
            for(int j=0;j<m;j++) now+=ve[i][j],ans=max(ans,now);
        }
        else
        {
            if(d==0)
            {
                for(int j=0;j<m;j++) now+=ve[i][j],ans=max(ans,now);
            }
            else
            {
                for(int j=0;j<len;j++) now+=ve[i][j],ans=max(ans,now);
            }
        }
    }
    cout<<ans;
    return 0;
}

3.Sum of Divisors

原题链接:

http://162.14.124.219/contest/1008/problem/D

反着回去找会爆,那就正着去找

查看代码
 #include <bits/stdc++.h>
#define int unsigned long long
#define PII pair<int,int>
using namespace std;
int a[10000010];
signed main() {
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j+=i)
            a[j]++;
    }
    int sum=0;
    for(int i=1;i<=n;i++)
        sum+=a[i]*i;
    cout<<sum;
    return 0;
}
posted @ 2024-07-17 20:34  伊芙加登  阅读(10)  评论(0编辑  收藏  举报