RUPC 2013 の阪大セットで解けそうなものを解いてみました。
2489
これはやるだけです
#include<stdio.h> #include<algorithm> using namespace std; int ABS(int a){return max(a,-a);} bool palin(int a){ int b=0; int c=a; while(c){ b*=10; b+=c%10; c/=10; } return a==b; } int main(){ int a; scanf("%d",&a); int ret=0; int d=99999999; for(int i=0;i<10000;i++){ if(palin(i)){ if(d>ABS(a-i)){ d=ABS(a-i); ret=i; } } } printf("%d\n",ret); }
2490
左から見ていって(の個数が常に)の個数より多く、最終的に同じ個数になればよいです。
#include<stdio.h> char str[2]; int main(){ int a; scanf("%d",&a); bool ok=true; int now=0; for(int i=0;i<a;i++){ int b; scanf("%s%d",str,&b); if(str[0]=='(')now+=b; else now-=b; if(now<0)ok=false; } if(ok&&now==0)printf("YES\n"); else printf("NO\n"); }
2494
まず、3つ以上の数のGCDは無視していいです。
また、ある数nを使うと決めたとき、GCDは必ずその数の約数tになりますが、ここでt
#include<stdio.h> #include<algorithm> using namespace std; pair<int,int> event[5000000]; int now[100001]; int main(){ int a,b; scanf("%d%d",&a,&b); int at=0; for(int i=1;i<=a;i++){ event[at++]=make_pair(i-b+1,i); event[at++]=make_pair(i+1,-i); for(int j=1;j*j<=i;j++){ if(i%j==0){ int c=i/j; if(j<b){ event[at++]=make_pair(i-b+1,j); event[at++]=make_pair(i-j+1,-j); event[at++]=make_pair(i+j-b+1,j); event[at++]=make_pair(i+1,-j); } if(c<b){ event[at++]=make_pair(i-b+1,c); event[at++]=make_pair(i-c+1,-c); event[at++]=make_pair(i+c-b+1,c); event[at++]=make_pair(i+1,-c); } } } } std::sort(event,event+at); int ret=0; int right=0; int left=0; for(int i=1;i<=a-b+1;i++){ while(event[right].first<=i){ if(event[right].second>0){ now[event[right].second]++; if(now[event[right].second]==1)ret++; } right++; } while(event[left].first<=i){ if(event[left].second<0){ now[-event[left].second]--; if(now[-event[left].second]==0)ret--; } left++; } //for(int j=1;j<=10;j++)printf("%d ",now[j]); printf("%d",ret); if(i<a-b+1)printf(" "); else printf("\n"); } }