最近我都不知道怎么评价自己了,说努力的话还远远不够,但说不努力可也比以前好多了,总之就是在进步吧。继续加油!
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的文本编辑器太烂了!