最近我都不知道怎么评价自己了,说努力的话还远远不够,但说不努力可也比以前好多了,总之就是在进步吧。继续加油!
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; }
#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; }
分析:这学期刚学离散,但这并不代表我就会。最后还是没有想到,唉!光荣的看了别人的题解!
这道先将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; }