您的位置:首页 > 其它

AtCoder Regular Contest 079 C D E

2017-07-31 11:16 453 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: