Codeforces Round #322 (CF 581 ABCD)题解
来源:互联网 发布:淘宝网退货率统计 编辑:程序博客网 时间:2024/06/07 19:21
打的一片渣渣啊。。。各种低级错误
代码能力还是欠缺不少
前四个题没有什么复杂的算法,后两个还没看
A:水题 3min过
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<stack>#include<queue>#include<algorithm>#include<cstdlib>#define maxn 201314#define inf 0x3f3f3f3f#define LL long longusing namespace std;int a,b;int main(){ cin>>a>>b; if(a>b) { int tmp=b; b=a; a=tmp; } //a<=b int t=b-a; int ans1=0; int ans2=0; if(t) { ans1=a; ans2=t/2; } else { ans1=a; ans2=0; } cout<<ans1<<" "<<ans2<<endl;}
给一个序列,要求对每个元素操作:如果在其后有比它大的,求出最少加上几能够使得其比其后所有元素严格大。对每个元素操作都是独立事件,并不涉及后面的元素询问
好吧题意说的有点乱。。
其实就是维护一个后缀q[n]来存储第i位之后的最大值,然后再遍历查询,O(N),但是要注意的是,q[i]是存储,在i位之后的最大值,不能包括第i位,我最开始包括了第i位,最后居然能过了pretest,真是迷醉
当然之后就被hack了
这是个很脑残的错误
code:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<stack>#include<queue>#include<algorithm>#include<cstdlib>#define maxn 201314#define inf 0x3f3f3f3f#define LL long longusing namespace std;int n;int q[100010];int ans[100010];int p[100010];int main(){ cin>>n; for(int i=0;i<=n;i++) { p[i]=-1; } for(int i=0;i<n;i++) { scanf("%d",&q[i]); } for(int i=n-2;i>=0;i--) { if(i==n-2)p[i]=q[i+1]; else { p[i]=max(p[i+1],q[i+1]); } } for(int i=0;i<n;i++) { if(p[i]>=q[i]){ ans[i]=(p[i]-q[i]+1); } else ans[i]=0; printf("%d",ans[i]); if(i<n-1) { printf(" "); } else cout<<endl; }}
C:
点技能点
你有n个技能,每个技能的熟练度在1-100之间,闭区间。现在这n个技能都有个初始值,你又有k个技能点可以给他们分配。rating值是这么计算的:对每个技能,将其熟练度除以10,向下取整,每个技能的这个值加和。
现在要求你合理分配技能点,使分配后的rating最高。
求每个技能对10取余的余数,余数越接近10,就优先加技能点,用这个原则扫一遍。
给他们加一圈技能点之后如果还剩下技能点,就需要做一个判断:有可能把所有技能点都加上去也不会超过100的限制,这时候就尽情加吧。。。也有可能直接都加上去就会导致超过限制,这时候就直接加满所有技能即可,做一个比较就可以了。这个判断见于代码后半部分,写了个注释的位置。
但是还有个细节要处理,就是初值全都是100的情况,最好是想办法特判,就是跳过而不是继续加技能点。。
别的没什么了,思路别乱就能写好
code :
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<stack>#include<queue>#include<algorithm>#include<cstdlib>#define maxn 201314#define inf 0x3f3f3f3f#define LL long longusing namespace std;struct node{ int a; int m;};int n,k;int sum=0;node q[100010];int s[100010];bool cmp(node p,node q){ return p.m<q.m;}int main(){ scanf("%d%d",&n,&k); int ans=0; int anss=0; for(int i=0; i<n; i++) { scanf("%d",&q[i].a); q[i].m=(10-(q[i].a)%10); ans+=(q[i].a/10); if(q[i].a==100)continue; //sum+=q[i].a; anss+=(100-(((q[i].a/10)*10)+10)); } anss/=10; sort(q,q+n,cmp); int i=0; while(k) { if(k>=q[i].m) { if(q[i].a==100) { i++; if(i==n)break; else continue; } k-=q[i].m; ans++; } if(k) i++; if(i==n)break; } if(k)//this is used to deal with the points remained unused. { int tmp1=k/10; int tmp2=anss; ans+=min(tmp1,tmp2); } printf("%d\n",ans);}
D:
有三个矩形logo,给出他们的尺寸,问能不能拼成一个正方形,矩形可以横放也可以竖着放。
这个题意多简洁!
然而代码很不好写。。。我写了226行。。。不知道有没有简洁方法。
我是暴力写的:检索每个边,如果能构成正方形,那么大正方形边长一定是这三个logo的边长最大值m。
以这个值为关键来搜索这三个logo,某一边长达到这个最大值m的,直接摆好就行
没有达到的,根据没有达到的logo数目,再搜索,如果有且仅有一个logo,它的两个边长都没有达到最大值m,那么这个大正方形一定拼不出来,这个不难想
如果有且仅有两个,则又要判断了,语言表示起来挺简单:如果这个大正方形能拼出来,这两个小的一定有某边长相等,这个对应题目的测试样例2,就是A和C并排的情况。
此外,即使存在某边长相等,又得看另外两边之和是否为m,只有这样才能保证拼出来是正方形
拼好之后再次检查两边长是否是相等的,都应该是m,若不是,答案仍是无解,输出-1
恩,我用了最笨的写法来实现他们
还有,代表三个logo的A,B,C是不能随意换的,输入中的第一个logo必须用A表示。。另两个同理。
赛后过的。。比赛时很难把这个过了。。
code:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<stack>#include<queue>#include<algorithm>#include<cstdlib>#define maxn 201314#define inf 0x3f3f3f3f#define LL long longusing namespace std;int j,k,l,pre,num;struct node{ int x,y,index;}s[3];int q[6];char sr[110][110];int vis[3];int main(){ int ans=0; int m=-1; for(int i=0; i<6; i++) { cin>>q[i]; m=max(m,q[i]); } s[0].x=q[0];s[0].y=q[1];s[0].index=0; s[1].x=q[2];s[1].y=q[3];s[1].index=1; s[2].x=q[4];s[2].y=q[5];s[2].index=2; vis[0]=vis[1]=vis[2]=0; j=k=l=pre=ans=0; num=3; bool flag=true; for(int i=0; i<3; i++) { if(s[i].x==m&&s[i].y==m) { flag=false; ans=-1; } else if(s[i].x==m||s[i].y==m) { num--; ans=m; vis[i]=1; for(j=pre; j<pre+min(s[i].x,s[i].y); j++) { for(k=0; k<m; k++) { sr[j][k]=char(s[i].index+65); } } pre=j; } } if(num==0) { if(j!=m) { flag=false; ans=-1; } } if(!flag) { cout<<ans<<endl; } else { if(num) { if(num==1) { ans=-1; } else { node o[2]; int t=0; for(int i=0; i<3; i++) { if(vis[i]==0) { o[t].x=s[i].x; o[t].y=s[i].y; o[t].index=s[i].index; t++; } } if(o[0].x==o[1].y) { if(o[0].y+o[1].x==m) { for(j=pre; j<pre+o[0].x; j++) { for(k=0; k<o[0].y; k++) { sr[j][k]=(char)(o[0].index+65); } for(k; k<m; k++) { sr[j][k]=(char)(o[1].index+65); } } if(j!=m) { ans=-1; } else ans=m; } else { ans=-1; } } else if(o[0].x==o[1].x) { if(o[0].y+o[1].y==m) { for(j=pre; j<pre+o[0].x; j++) { for(k=0; k<o[0].y; k++) { sr[j][k]=(char)(o[0].index+65); } for(k; k<m; k++) { sr[j][k]=(char)(o[1].index+65); } } if(j!=m) { ans=-1; } else ans=m; } else { ans=-1; } } else if(o[0].y==o[1].x) { if(o[0].x+o[1].y==m) { for(j=pre; j<pre+o[0].y; j++) { for(k=0; k<o[0].x; k++) { sr[j][k]=(char)(o[0].index+65); } for(k; k<m; k++) { sr[j][k]=(char)(o[1].index+65); } } if(j!=m) { ans=-1; } else ans=m; } else { ans=-1; } } else if(o[0].y==o[1].y) { if(o[0].x+o[1].x==m) { for(j=pre; j<pre+o[0].y; j++) { for(k=0; k<o[0].x; k++) { sr[j][k]=(char)(o[0].index+65); } for(k; k<m; k++) { sr[j][k]=(char)(o[1].index+65); } } if(j!=m) { ans=-1; } else ans=m; } else { ans=-1; } } else { ans=-1; } } } if(ans==-1) { cout<<ans<<endl; } else { cout<<ans<<endl; for(int i=0; i<m; i++) { for(int j=0; j<m; j++) { printf("%c",sr[i][j]); } cout<<endl; } } }}
- Codeforces Round #322 (CF 581 ABCD)题解
- Codeforces Round #396 (Div. 2)题解(ABCD)
- Codeforces Round #429 (Div. 2) 题解(ABCD)
- Codeforces Round #302 (Div. 2) (ABCD题解)
- Codeforces Round #250 (Div. 2) (ABCD题解)
- Codeforces Round #248 (Div. 2) (ABCD题解)
- Codeforces Round #249 (Div. 2) (ABCD题解)
- Codeforces Round #315 (Div. 2) (ABCD题解)
- Codeforces Round #Pi (Div. 2) (ABCD题解)
- Codeforces Round #323 (Div. 2) (ABCD题解)
- Codeforces Round #453 (Div. 2) ABCD题解
- Codeforces Round #318(ABCD)
- Codeforces Round #246 (Div. 2) (ABCD详细题解)
- Codeforces Round #324 (Div. 2) 584ABCD题解
- Codeforces AIM TECH Round 4 (Div 2) 题解 (ABCD)
- Codeforces Round #313 (Div. 2) (ABCD)
- Codeforces Round #Pi (Div. 2) (ABCD)
- Codeforces Round #316 (Div. 2)(ABCD)
- C/C++ printf函数参数的执行顺序
- Linux 环境下Oracle PRO*C程序的编写简单范例
- uC/OS-II 函数之邮箱管理相关函数
- *LeetCode-Convert Sorted List to Binary Search Tree
- C++中有关STL自带的排序函数:sort、qsort
- Codeforces Round #322 (CF 581 ABCD)题解
- C# WebBrowser 控件的使用
- Fresco前传(1):一句话搞定图片显示(同时还可以满足各种小需求哦)
- Redis复制
- 二叉树中和为某一值的路径(剑指offer+二叉树+递归)
- POJ - 1661 Help Jimmy(DP)
- 3. Java修饰符
- Java------集合
- Codeforces 578C Weakness and Poorness(二分 + 最大(小)子段和)