2017年西南民族大学程序设计竞赛【题解完成】

77 阅读5分钟
题目难度知识点
A 星图★★模拟
B 好数签到
C 装进肚子★★贪心
D ZZZZone爱吃糖模拟
E 开心的涂刷组合数
F 兼职数靶模拟
G 卡牌游戏模拟
H Hungry!模拟
I 快饿死的XzzF★★dfs
J 小猪佩奇练打字★★模拟
k 免费WiFi差分


image.png 打的比较爽的一场。这种简单场太能提升自信心了。

星图

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
char a[N][N];
int n,m,q;
void solve(int x,int y,char op)
{
    int flag=0;
    if(op=='U')
    {
        int stx=x,sty=y;
        while(stx>=1&&a[stx][sty]=='*') stx--;
        if(!stx) flag=1;
        
    }else if(op=='L')
    {
        int stx=x,sty=y;
        while(sty>=1&&a[stx][sty]=='*') sty--;
        if(!sty) flag=1;
        
    }else if(op=='R')
    {   
        int stx=x,sty=y;
        while(sty<=m&&a[stx][sty]=='*') sty++;
        if(sty>m) flag=1;
    }else if(op=='D')
    {
        int stx=x,sty=y;
        while(stx<=n&&a[stx][sty]=='*') stx++;
        if(stx>n) flag=1;
    }
    if(flag) puts("YES");
    else puts("NO");
}
int main(void)
{
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) cin>>a[i][j];
    while(q--)
    {
        int x,y;
        char op; scanf("%d %d %c",&x,&y,&op);
        solve(x,y,op);
    }
    return 0;
}

好数

image.png

#include<bits/stdc++.h>
using namespace std;
int st[15];
string a;
int main(void)
{
    cin>>a;
    for(int i=0;i<a.size();i++) st[a[i]-'0']=1;
    int cnt=0;
    for(int i=0;i<10;i++) cnt+=st[i];
    if(cnt>=2) puts("NO");
    else puts("YES");
    return 0;
}

装进肚子

image.png 我的做法就是将白天大于黑的用一个存,黑的大于白的用一个存,而后判断看一下,而后就是根据差值排序。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL n,x,y,k,ans;
const int N=1e6+10;
struct node
{
    LL x,y,z;
}Node[N];
bool cmp(node a,node b){return a.z>b.z;}
vector<node>ve1,ve2;
int main(void)
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        cin>>Node[i].x;
    }
    for(int i=0;i<n;i++)
    {
        cin>>Node[i].y;
    }
    for(int i=0;i<n;i++)
    {
        if(Node[i].x>=Node[i].y) 
        {
            Node[i].z=Node[i].x-Node[i].y;
            ve1.push_back(Node[i]);
        }else
        {
            Node[i].z=Node[i].y-Node[i].x;
            ve2.push_back(Node[i]);
        }
    }
    sort(ve1.begin(),ve1.end(),cmp);
    sort(ve2.begin(),ve2.end(),cmp);
    LL ans=0;
    if(ve1.size()>=k)
    {
        for(int i=0;i<k;i++) ans+=ve1[i].x;
        for(int i=k;i<ve1.size();i++) ans+=ve1[i].y;
        for(int i=0;i<ve2.size();i++) ans+=ve2[i].y;
    }else
    {
        for(int i=0;i<ve1.size();i++) ans+=ve1[i].x;
        int t=k-ve1.size();
        for(int i=ve2.size()-1,j=1;j<=t;i--,j++) ans+=ve2[i].x;
        for(int i=ve2.size()-1-t;i>=0;i--) ans+=ve2[i].y;
    }
    cout<<ans;
    return 0;
}

好的想法 利用结构体分别存储早上和晚上的甜蜜值 先假设晚上把巧克力全部吃完, 然后将早上甜蜜值减去晚上甜蜜值,从大到小排序,看哪个差值更大,说明早上吃更划算 最后根据排序替换掉前k个本应该在早上吃的。

ZZZZone爱吃糖

image.png 总的方案-不能的方案。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],s[N],n,m,ans=0;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
    cin>>m;
    while(m--)
    {
        int l,r; cin>>l>>r;
        ans+=max(0ll,s[r]-s[l-1]);
    }
    cout<<ans;
    return 0;
}

开心的涂刷

image.png

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const long long int mod=1000000007;
LL n,m;
LL qsm(LL a,LL b,LL p)
{
    LL sum=1;
    a=a%p;
    while(b)
    {

        if(b&1) sum=(sum*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return sum%p;
}
void solve()
{
    LL temp1=qsm(m,n,mod);
    LL temp2=(m%mod) *qsm(m-1,n-1,mod)%mod;
    cout<<(temp1-temp2+mod)%mod;
}
int main(void)
{
    cin>>n>>m;
    solve();
    return 0;
}

兼职数靶

image.png

#include<bits/stdc++.h>
using namespace std;
 int arr[13][13] = {
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
        {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
        {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
        {1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 4, 4, 4, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1},
        {1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1},
        {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
        {1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1},
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
    };
char a[15][15];
int main(void)
{
    int n; 
    while(cin>>n)
    {
        if(n==0) break;
        double cnt=0;
        for(int i=0;i<13;i++)
        {
            for(int j=0;j<13;j++)
            {
                cin>>a[i][j];
                if(a[i][j]=='#') cnt+=arr[i][j];
            }
        }
        printf("%.2lf\n",cnt/n);
    }
    return 0;
}

卡牌游戏

image.png

#include<bits/stdc++.h>
using namespace std;
int cnt1,cnt2;
bool check(string a,string b)
{
    if(a=="Jin"&&b=="Mu") return 1;
    if(a=="Mu"&&b=="Tu") return 1;
    if(a=="Tu"&&b=="Shui") return 1;
    if(a=="Shui"&&b=="Huo") return 1;
    if(a=="Huo"&&b=="Jin") return 1;
    return 0;
}
int main(void)
{
    int n; cin>>n;
    while(n--)
    {
        string a,b; cin>>a>>b;
        if(check(a,b))cnt1++;
        else if(check(b,a)) cnt2++;
    }
    if(cnt1>cnt2) puts("Alice");
    else if(cnt1<cnt2) puts("Bob");
    else puts("Draw");
    return 0;
}

Hungry!

#include<bits/stdc++.h>
using namespace std;
int main(void)
{  
    int n; cin>>n;
    while(n--)
    {
        string a="gu...";
        for(int i=0;i<n;i++) cout<<a;
        cout<<'\n';
        puts("The story is so boring. And I am so hungry!");
    }
    return 0;
}

快饿死的XzzF

image.png

#include<bits/stdc++.h>
using namespace std;
int ans,n;
void dfs(int index,int fa)
{
    if(index==n)
    {
        ans++;
        return;
    }
    for(int i=0;i<2;i++)
    {
        if(i==0&&fa==0) continue;
        dfs(index+1,i);
    }
}
int main(void)
{
    cin>>n;
    dfs(0,-1);
    cout<<ans;
    return 0;
}

小猪佩奇练打字

image.png

#include<bits/stdc++.h>
using namespace std;
string s;
int m;
int main(void)
{
    while(cin>>s>>m)
    {
        string a="abcdefghijklmnopqrstuvwxyz";
        while(m--)
        {
           char l,r; cin>>l>>r;
           swap(a[l-'a'],a[r-'a']);
        }
        for(int i=0;i<s.size();i++)
        {
            cout<<a[s[i]-'a'];
        }
        puts("");
    }
    return 0;
}

免费WiFi

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int s[N],n,m;
int main(void)
{
    cin>>n>>m;
    while(n--)
    {
        int l,r; cin>>l>>r;
        s[l]++,s[r+1]--;
    }
    int temp=0;
    for(int i=1;i<=1e5;i++) s[i]+=s[i-1],temp=max(temp,s[i]);
    int ans=temp/m;
    if(temp%m) ans++;
    cout<<ans;
    return 0;
}