AtCoder Regular Contest 079 C D E

来源:互联网 发布:vc贪吃蛇c语言代码 编辑:程序博客网 时间:2024/06/06 09:37

C 问是否能两步从1到达n

开两个数组存是否能一步到达1和n

#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define PI acos(-1.0)typedef long long ll;const int maxn=2e5+5;int vis1[maxn],vis2[maxn];int main(){    int n,m;    cin >> n >> m;    int cnt=0;    int flag=1;    for(int i=0;i<m;i++)    {        int a,b;        cin >> a >> b;        if(a==1)            vis1[b]=1;        if(b==1)            vis1[a]=1;        if(a==n)            vis2[b]=1;        if(b==n)            vis2[a]=1;    }    for(int i=1;i<=n;i++)        if(vis1[i]&&vis2[i])        {            cout << "POSSIBLE" << endl;            return 0;        }    cout << "IMPOSSIBLE" << endl;    return 0;}

D n个数,每个数的初始数字为a[i],如果最大的数大于等于n,则最大的数-n,其余的数+1,现在进行k次这样的操作,求n及a[i]

直接拿n=50来构造,拿其他数字会超范围,我们可以发现经过n次循环之后,a[i]的每个数必然会-1,假设最终态为0,1,2,3...49,最终态的上一层必然为1,2,3,...50,以此类推上去,令res=k%n,假若res!=0,我们就要处理多res次循环,因此将前res个数+50

#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define PI acos(-1.0)typedef long long ll;const int maxn=1e5+5;int main(){    ll k;    scanf("%lld",&k);    int n=50;    cout << n << endl;    ll res=k%50;    ll x=k/50-1;    ll cnt=res;    for(ll i=1;i<=50;i++)    {        if(cnt>0)        {            printf("%lld ",i+50-res+1+x);            cnt--;        }        else            printf("%lld ",i-res+x);    }    cout << endl;    return 0;}

E 与D题相反,给出n及a[i],求k

直接暴力求解

#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define PI acos(-1.0)typedef long long ll;const int maxn=100;ll a[100],n,k;int main(){    cin >> n;    for(int i=0;i<n;i++)        cin >> a[i];    while(1)    {        ll maxx=-1,index=0;        for(int i=0;i<n;i++)            if(maxx<a[i])                maxx=a[i],index=i;        if(maxx<n)            break;        for(int i=0;i<n;i++)        {            if(index==i)                a[i]%=n;            else                a[i]+=(maxx/n);        }        k+=(maxx/n);    }    cout << k << endl;    return 0;}