您的位置:首页 > 其它

Codeforces Round #109 (Div. 2)

2012-10-25 13:18 323 查看
做题时不够冷静确实是很大的一个缺点,这次让我吃了不少苦,A题,简单一看便有了思路,短短几行代码敲上,原本以为毫无疑问的AC了,可是结果出乎我的意料,WA,这时心里就开始着急了,因为一次WA会浪费不少时间,加上罚时,……稍作修改,提交,WA,这时心里是真不淡定了,如此简单一道题竟然这样,好吧,闭上眼想一下,马上发现问题,修改,提交。。。。终于过了,这时后开始B题,第一次理解错题意,WA……,然后修改后AC,前两道题没能一次AC,心里本来就有些急躁,看了一下C,一时没想法,看D题,数据量太大,可能需要用优先级队列,或许有优化的方法,不过也是一时没想到,转回去看C题,想了一会有了思路,敲上,WA,开始修改,接着笔记本电脑没电了,比赛也快结束了……
总的来说还是自己水平不够,还得好努力,做题不够稳。。

A 题,给出一些数,如果一个数它比它前面的每个数都大,或者都小,则是一个amizing num,要求出这些数中有多少amizing num,只需要让每个数和它前面的数相比就是了;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
int a[1010];
int main()
{
//freopen(\"in.txt\",\"r\",stdin);
int n;
while(cin>>n)
{
int flag,cnt=0;
for(int i=0;i<n;i++)
{
flag=0;
cin>>a[i];
for(int j=0;j<i;j++)
{
if(a[i]>a[j])
flag++;
}
if(i>=1&&flag==i)
cnt++;
flag=0;
for(int j=0;j<i;j++)
{
if(a[i]<a[j])
flag++;
}
if(i>=1&&flag==i)
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
B题 ,每张牌上有两个数,ai,bi,如果你打出一张牌,你将得到ai point,并且还能再打出bi张牌,有个计数器countor,初始值为1,每打出一张牌count+=bi, countor - -,;直到计数器为0,或者所有的牌打完,要求出最大得分,当然,首先应该打出尽量多的牌,那么先按bi从大到小排序,再按ai从大到小排序;依次遍历就好了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
struct In
{
int x;
int y;
} s[1010];
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->y != d->y) return d->y-c->y;
else return d->x - c->x;
}
int main()
{
//freopen(\"in.txt\",\"r\",stdin);
int n,a,b;
while(cin>>n)
{
bool flag=false;
int cnt=1,point=0;
for(int i=0; i<n; i++)
{
cin>>s[i].x>>s[i].y;
}
qsort(s,n,sizeof(s[0]),cmp);
for(int i=0;i<n;i++)
{
point+=s[i].x;
cnt+=s[i].y;
cnt--;
if(cnt==0)
break;
}
cout<<point<<endl;
}
return 0;
}

C题,用map特别简单,不过也是要考虑清楚,不能漏掉特殊情况
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<map>
using namespace std;
map<char ,char>m;
char s[100010];
int main()
{
//freopen(\"in.txt\",\"r\",stdin);
int k;
while(cin>>s>>k)
{
char a,b;
for(int i=0;i<k;i++)
{
cin>>a>>b;
m[a]=b;
m[b]=a;
}
int flag=0,len=strlen(s),cntx,cnty,cnt=0;
char x,y;
for(int i=0;i<len;i++)
{
if(i==0) x=s[0],cntx=1;
else if(i==1) y=s[1],cnty=1;
else if(x==s[i])cntx++;
else if(y==s[i])cnty++;
else if(x!=s[i]&&y!=s[i])
{
if(m[x]==y)
cnt+=min(cntx,cnty);
x=s[i-1];
cntx=flag;
y=s[i];
cnty=1;
}
if(i>0&&s[i-1]==s[i])flag++;
else flag=1;
}
if(m[x]==y) cnt+=min(cntx,cnty);
cout<<cnt<<endl;
}
return 0;
}
D题,‘ + ‘:如果一个位置状态是off,其他的所有状态是on的位置没有和它有公共因子那么“Success”,状态变为on,其他的所有状态
是on的位置没有和它没有公共因子那么 “Conflict with ***”,***如果多个可以是任意一个,
如果一个位置状态是 on ,那么 Already on
‘-’: 如果一个位置状态是on,那么状态变为off,“Success”
如果一个位置状态是off,“Already off”

不会优先级队列,最后换了个别的方法
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
int flag[100010],on[100010];
int main()
{
int n,m,k,i;
//freopen(\"in.txt\",\"r\",stdin);
char s[2];
while(cin>>n>>m)
{
memset(flag,-1,sizeof(flag));
memset(on,0,sizeof(on));
while(m--)
{
int mark=-1;
cin>>s;
if(s[0]==\'+\')
{
cin>>k;
if(on[k])
{
cout<<\"Already on\"<<endl;
on[k]=1;
}
else
{
for( i=2; i*i<=k; i++) if(!(k%i))
{
if(flag[i]!=-1)
{
mark=flag[i];
break;
}
if(flag[k/i]!=-1)
{
mark=flag[k/i];
break;
}
}
if(flag[k]!=-1)
mark=flag[k];
if(mark==-1)
{
for( i=2; i*i<=k; i++) if(!(k%i))
{
flag[i]=k;
flag[k/i]=k;
}
flag[k]=k;
on[k]=1;
cout<<\"Success\"<<endl;
}
else
cout<<\"Conflict with \"<<mark<<endl;
}
}
else
{
cin>>k;
if(on[k])
{
for(i=2; i*i<=k; i++) if(!(k%i))
{
flag[i]=-1;
flag[k/i]=-1;
}
flag[k]=-1;
on[k]=0;
cout<<\"Success\"<<endl;
}
else
cout<<\"Already off\"<<endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: