我的隔天Codeforces——Round #334 (Div. 2)

最近我都不知道怎么评价自己了,说努力的话还远远不够,但说不努力可也比以前好多了,总之就是在进步吧。继续加油!

A. Uncowed Forces
题意:简单来说,就是给你一个函数关系(文字表达),和参数,让你求出函数值
分析:这题比较水吧,就是写一函数算每一道题目的得分,然后加起来加上hack的得分,没啥难度,注意精度把!

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 40000+5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IT iterator


typedef long long ll;
const double eps = 1e-9;
const double pi  = acos(-1);
const ll mod = 1e9+7; 


double cal(int m,int w,int x)
{
	x*=500;
	return max(0.3*x,(1.0-m/250.0)*x-50.0*w);
}
int main()
{
	int m[5],w[5],h0,h1;
	double sco=0;
	for(int i=0;i<5;i++)
		scanf("%d",m+i);
	for(int i=0;i<5;i++)
		scanf("%d",w+i);
	scanf("%d %d",&h0,&h1);
	for(int i=0;i<5;i++)
		sco+=cal(m[i],w[i],i+1);
	sco+=(h0*100.0-50.0*h1);
	printf("%.0f\n",sco);
	return 0;
}

B. More Cowbell

题意:给你n个物品,每个物品有权值wi(权值按从小到大给出,无须排序)。让你将这些物品刚好放在k个盒子里(不能有盒子是空的),而且每个盒子最多只能放两个物品,这两个物品的权值和不能超过盒子的权值。求相同的k个盒子的最小权值是多少。
分析:不用想太多,这就是一道简单的贪心题,先判断k是不是比n大或者相等,如果满足那么直接输出最后一个盒子的权值;如果不满足,那么将前2*(n-m)个物品对折放置,就是第1个与第2*(n-m)个放在一起,第2个与第2(n-m)-1个放在一起,依次类推。。。求出此时最大的权值,输出即可!


#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 100000+5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IT iterator


typedef long long ll;
const double eps = 1e-9;
const double pi  = acos(-1);
const ll mod = 1e9+7; 


int box[maxn];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",box+i);
    if(m>=n)
    {
        printf("%d\n",box[n]);
        return 0;
    }
    m=n-m;
    int ma=box[n];
    for(int i=1;i<=m;i++)
        ma=max(ma,box[i]+box[2*m+1-i]);
    printf("%d\n",ma);
    return 0;
}
C - Alternative Thinking

题意:简单的说,就是给你一个01串,允许你翻转其中的一个连续的01子串,翻转之后求不一定连续的01子串的最大长度,而且要求这个子串每相邻的两个字符不同。

分析:这也是一道贪心。我是这么想的:我先处理一下给我的原01串,将01串中连续相同字符的个数记录下来,得到一个数组。要使所求子串的长度最大,显然发现不管怎么翻转,最多将长度扩大2,最少扩大0。那么考察分别扩大0,1,2的情况:如果数组中有一个数大于2(至少为3),那么我可以翻中间的子串,那么此时扩大2;当数组中出现没有数超过2,但是有2个及其以上的2的时候,我可以取相邻(两个2之间没有其他2)的2,一个从2的后一个开始,一个从2的前一个结束,将这个连续子串翻转,那么也可以扩大2;当仅有一个2出现时,那么此时从这个2的后一个开始,一直到结束,全部翻转,那么最多扩大1;如果更加不辛的,整个子串是01010.....,那么不管你怎么翻转,长度只会减少或者不变,那么原样输出!

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 100000+5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IT iterator


typedef long long ll;
const double eps = 1e-9;
const double pi  = acos(-1);
const ll mod = 1e9+7; 


char str[maxn];
int main()
{
    int n;
    scanf("%d %s",&n,str);
    int ans=0,k=1;
    bool f1=false;
    int kk=0;
    for(int i=1;i<n;i++)
    {
        if(str[i]==str[i-1])k++;
        else 
        {
            if(k>2)f1=true;
            else if(k==2)kk++;
            k=1;
            ans++;
        }
    }
    if(k>2)f1=true;
    else if(k==2)kk++;
    ans++;
    if(f1||kk>=2)printf("%d\n",ans+2);
    else if(kk)printf("%d\n",ans+1);
    else printf("%d\n",ans);
    return 0;
}



D - Moodular Arithmetic

题意:给你一个函数关系等式,求满足这个等式的函数的个数。

分析:这学期刚学离散,但这并不代表我就会。最后还是没有想到,唉!光荣的看了别人的题解!

这道先将k分情况考虑,当k为0的时候,那么除了f(0)=0之外,其他的随意,那就是p^(p-1);当k为1时,所有情况都随意,那么就是p^p;当k大于1的时候,判断有多少个互相联系制约的组(类似等价类、划分神马的)(0不用管,f(0)=0必须的),那么每个组的解有p种(因为这个组里是互相制约的,就相当于定好了一个,那么其他的也确定了,不能改变了),那么就是p^cnt(cnt是组数)。

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;


#define clr(x,y) memset(x,y,sizeof(x))
#define maxn 1000000+5
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define IT iterator


typedef long long ll;
const double eps = 1e-9;
const double pi  = acos(-1);
const ll mod = 1e9+7; 




int vis[maxn];
ll qlow(ll a,ll n)
{
	ll ans=1;
	while(n)
	{
		if(n&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		n>>=1;
	}
	return ans;
}
int main()
{
	ll k,p;
	scanf("%I64d %I64d",&p,&k);
	ll ans;
	if(k==0)ans=qlow(p,p-1);
	else if(k==1)ans=qlow(p,p);
	else 
	{
		ll ant=0;
		clr(vis,0);
		vis[0]=1;
		for(int i=1;i<p;i++)
		{
			if(vis[i])continue;
			vis[i]=1;
			ll cc=i;
			while(1)
			{
				cc=(cc*k)%p;
				if(vis[cc])break;
				vis[cc]=1;
			}
			ant++;
		}
		ans=qlow(p,ant);
	}
	printf("%I64d\n",ans%mod);
	return 0;
}

最后吐槽一下,这csdn的文本编辑器太烂了!

你可能感兴趣的:(codeforces)