标签:codeforces
A题:
题目地址:Bear and Elections
题意:最少变换多少次可以使得第一个数字大于后面所有数字。
思路:把后面n-1个数排序,让第一个和最后一个数比较,然后增减。知道第一个数大于最后一个数为止
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
int a[110];
int main()
{
int n;
int cnt;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
cnt=0;
while(1){
sort(a+1,a+n);
if(a[0]<=a[n-1]){
a[0]++;
a[n-1]--;
cnt++;
}
else
break;
}
printf("%d\n",cnt);
}
return 0;
}
B题:
题目地址:Bear and Three Musketeers
题意:给你一个图然后判断是否能构成三角形,如果能,输出最小的点数三角形,如果不能输出-1
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=4010;
int vis[Maxn][Maxn];
int deg[Maxn];
int main()
{
int n,m;
int x,y;
while(~scanf("%d %d",&n,&m)){
memset(vis,0,sizeof(vis));
memset(deg,0,sizeof(deg));
while(m--){
scanf("%d %d",&x,&y);
deg[x]++;
deg[y]++;
vis[x][y]=vis[y][x]=1;
}
int Min=inf;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(vis[i][j]){
for(int k=j+1;k<=n;k++){
if(vis[k][j]&&vis[k][i]){
Min=min(Min,deg[i]+deg[j]+deg[k]-6);
}
}
}
}
}
if(Min==inf)
puts("-1");
else
printf("%d\n",Min);
}
return 0;
}
C题:
题目地址:Bear and Poker
题意:一个长度为n的数组,每个数可以变成自身的2或3倍,问你能否将这n个数变为一个数。
思路:将每个数除以2和3,直到没有2和3的质因子,然后加到set中,如果set中最后只剩下一个数那么就可以,否则就不可以。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
set<int >q;
int main()
{
int n,x;
while(~scanf("%d",&n)) {
while(n--){
scanf("%d",&x);
while(x%2==0) x/=2;
while(x%3==0) x/=3;
q.insert(x);
}
if(q.size()==1)
puts("Yes");
else
puts("No");
}
return 0;
}
D题:
题目地址:Bear and Blocks
题意:给出一排序列,每次将外层的方块去掉,问总共最少要多少步。
思路:从前往后找到每一个的最少步数,从后往前找到每一个的最小步数,然后从后往前找每一个的最小步数,然后两个比较找当前最小。然后找所有的里面最大的(因为要满足所有的情况)
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
int h[Maxn];
int dp1[Maxn],dp2[Maxn];
int res[Maxn];
int main()
{
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
scanf("%d",&h[i]);
dp1[0]=1;
for(int i=1;i<n;i++)
dp1[i]=min(dp1[i-1]+1,h[i]);
dp2[n-1]=1;
for(int i=n-2;i>=0;i--)
dp2[i]=min(dp2[i+1]+1,h[i]);
for(int i=0;i<n;i++){
res[i]=min(dp1[i],dp2[i]);
}
sort(res,res+n);
printf("%d\n",res[n-1]);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Codeforces Round #318(Div. 2)(A,B,C,D)
标签:codeforces
原文地址:http://blog.csdn.net/u013486414/article/details/48103141