今日だけで超頑張ったら22問解けて大満足です。
いくつかの問題ではmap様様な感じになっていました。
せっかくなので今日解いた全ての問題のソースコードを貼りつけたいなと思います。
一応以下のようなものを全てのコードの先頭につけてました。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
static const double EPS = 1e-5;
typedef long long ll;
7:31
ヨセフスの問題というものらしいです。wikipediaみないとTLEしてまともに解けませんでした。
int n,m,k;
int joseph(int n,int k){
if(n==1)return 1;
else return (k-1+joseph(n-1,k))%n+1;
}
main(){
while(cin>>n>>k>>m){
if(n==0 && m==0 && k==0){
break;
}else{
cout=Q){
i=Date[k];
l=k;
}
}
printf("%d\n",l);
}
return 0;
}
7:43
実装ゲー。面倒かと思って敬遠していましたが、案外すぐに書けました。
int kousi[21][21];
int main(){
int N,M;
while(cin>>N){
if(N==0)break;
memset(kousi,0,sizeof(kousi));
for(int i=0;i>x>>y;
kousi[x][y]=1;
}
int M,cx=10,cy=10;
if(kousi[cx][cy]){
kousi[cx][cy]=0;
--N;
}
cin>>M;
for(int i=0;i > amida;
int main(){
int n,m,a;
while(cin>>n>>m>>a){
if((n|m|a)==0)break;
amida.clear();
for(int i=0;i>h>>p>>q;
amida[h][q]=p;
amida[h][p]=q;
}
int h=1000;
while(h){
if(amida[h][a]==0){
--h;
continue;
}
//cout0)value+=125*n;
n-=10;
if(n>0)value+=15*n;
n-=10;
if(n>0)value+=20*n;
return value;
}
int main(){
int sui,sen,kon;
sen=4280;
while(cin>>sui){
if(sui==-1)break;
kon=kakaku(sui);
cout>n){
if(n==0)break;
memset(kind,0,sizeof(kind));
for(int i=0;i>k;
++kind[k];
}
for(int i=0;i>n){
if(n==0)break;
for(int i=0;i>n;
one[i]=n;
++te[n];
}
int hiki=0;
for(int i=1;i kyori;
int main(){
int n;
while(cin>>n){
if(n==0)break;
kyori.clear();
int max,maxno;
for(int i=0;i>p>>d1>>d2;
kyori[p]=d1+d2;
max=d1+d2;
maxno=p;
}
for(map::iterator p=kyori.begin();p!=kyori.end();++p){
if(p->second>max){
max=p->second;
maxno=p->first;
}
}
cout>n){
if(n==0)break;
for(int i=0;i>pm>>pe>>pj;
if(pm==100 || pe==100 || pj==100)puts("A");
else if(pe+pm>=180)puts("A");
else if(pe+pm+pj>=240)puts("A");
else if(pe+pm+pj>=210)puts("B");
else if(pe+pm+pj>=150 && (pe>=80 || pm>=80))puts("B");
else puts("C");
}
}
return 0;
}
10:57
素数は最近はエラトステネスの篩ぐらいしか使いませんね。回答者の実行速度やメモリサイズとかを見ると自分じゃぜんぜん追いつけない速さの人たちもいたりするので、どうなっているんだと驚くばかりです。コードサイズが大きい人はある程度ハードコードしてそうなんですが、500byte切っていて、なおかつ0.01とかの速度の人はどうなっているんでしょうかね?
ちなみに1TLEと1MLEを食らいました。
char so[10000001];
main(){
so[0]=so[1]=1;
for(int i=2;i*i>n){
if(n==0)break;
while(1){
if(so[n]|so[n-2]|so[n-6]|so[n-8]);
else break;
--n;
}
cout>d){
if(d=pow(2,7-i)){
d-=pow(2,7-i);
pr[i]='1';
}else{
pr[i]='0';
}
}else if(i==8){
pr[i]='.';
}else{
if(d>=pow(2,8-i)){
d-=pow(2,8-i);
pr[i]='1';
}else{
pr[i]='0';
}
}
}
if(d!=0)puts("NA");
else puts(pr);
}
return 0;
}
13:36
A問題なので簡単ですね。ってか何で表示部分を関数にして分けてるんでしょうかね。
void turi(int n){
printf("%d %d %d\n",n%500/100,n%1000/500,n/1000);
}
main(){
int a,b;
while(cin>>a>>b){
if(a==0 && b==0)break;
turi(b-a);
}
return 0;
}
14:01
再帰をうまいこと使って何とか通せたと思います。結構考えるのが楽しい感じの問題でした。
探索をするようなコードは自分の中では高度な問題の部類になってしまうので、もうちょっと練習したいと思います。
typedef struct t{
int x,y;
int loop;
int scanned;
}za;
za gyou[100][100];
int loop;
int tansaku(int x,int y){
if(gyou[x][y].scanned&&gyou[x][y].loop){
return gyou[x][y].loop;
}else if(gyou[x][y].scanned){
++loop;
gyou[x][y].loop=loop;
return gyou[x][y].loop;
}else{
gyou[x][y].scanned=1;
gyou[x][y].loop=tansaku(gyou[x][y].x,gyou[x][y].y);
}
return gyou[x][y].loop;
}
main(){
int N;
while(cin>>N){
if(N==0)break;
for(int i=0;i>x>>y;
gyou[j][i].x=x;
gyou[j][i].y=y;
gyou[j][i].loop=0;
gyou[j][i].scanned=0;
}
}
loop=0;
for(int i=0;i>n){
if(n==0)break;
for(int i=0;i>t;
seki[j][i]=t;
te[j][i]=0;
}
}
for(int i=0;iseki[j][i]){
max=seki[j][i];
maxj=j;
}
}
if(te[maxj][i]){
cout>W>>Q){
if(W==0 && Q==0)break;
for(int i=0;i>c;
if(c=='s'){
int id,w;
cin>>id>>w;
int f=0,b=0;
for(int i=0;i=w){
cout>id;
for(int i=0;i>n){
if(n==0)break;
int mem[n],min=0;
for(int i=0;i>mem[i];
min+=mem[i];
}
for(int i=0;i>j&1)po+=mem[j];
else go+=mem[j];
}
if(abs(go-po)>D){
if(D==0)break;
double px,py,vx,vy,d;
cin>>px>>py>>vx>>vy;
if(py*vx==vy*px){
double nvx=sqrt(px*px+py*py)*vx/sqrt(vx*vx+vy*vy),nvy=sqrt(px*px+py*py)*vy/sqrt(vx*vx+vy*vy);
if(abs(nvx-px)D)puts("impossible");
else printf("%.8lf\n",d);
}
}
18:41
履歴管理が多少手間です。WとHの必要性がよく分かりませんでした。
typedef struct _button{
int xl,yu,xr,yl;
string name;
}button;
map > page;
vector rireki;
main(){
int n;
while(cin>>n){
if(n==0)break;
page.clear();
rireki.clear();
int W,H;
cin>>W>>H;
for(int i=0;i>name>>b;
if(i==0)rireki.push_back(name);
for(int j=0;j>xl>>yu>>xr>>yl>>tname;
button tbutton={xl,yu,xr,yl,tname};
page[name].push_back(tbutton);
}
}
int m;
cin>>m;
int p=0;
for(int i=0;i>com;
if(com=="click"){
int x,y;
cin>>x>>y;
string target="";
for(vector::iterator vp=page[rireki[p]].begin();vp!=page[rireki[p]].end();++vp){
if(vp->xr>=x && vp->xlyuyl>=y)target=vp->name;
}
if(target=="")continue;
if(p==rireki.size()-1){
rireki.push_back(target);
++p;
}else{
++p;
rireki[p]=target;
while(p+1>a>>b){
if(a==0 && b==0)break;
//printf("a %d b %d ",key(a),key(b));
puts(key(a)>key(b)?"a":"b");
}
}
19:50
mapはあらかじめ辞書順に格納されるようなので、それにたいしてイテレータでアクセスすればいいので楽な思いをしました。
が、最初 map > index;という感じで宣言したらコンパイルできなくて、いろいろと悩んでました。結局何でエラーだったのかいまだに分からず・・・。そんな名前の関数ありましたっけ?
map > idx;
main(){
string name;
int page;
while(cin>>name>>page){
idx[name].push_back(page);
}
for(map >::iterator p=idx.begin();p!=idx.end();++p){
coutfirstsecond.begin(),p->second.end());
int sf=0;
for(vector::iterator vp=p->second.begin();vp!=p->second.end();vp++){
if(sf==1)cout>a>>b){
if(a==0 && b==0)break;
vector data;
data.resize(4);
int mins=a*a+b*b;
for(int i=1;i*ii*i+j*j+k*k)mins=i*i+j*j+k*k;
}
}
}
}
cout kyaku;
int main(){
int n;
while(cin>>n){
if(n==0)break;
kyaku.clear();
for(int i=0;i>t;
kyaku.push_back(t);
}
sort(kyaku.begin(),kyaku.end());
ll ans=0;
vector mati;
mati.push_back(0);
for(int i=0;i<n-1;i++){
mati.push_back(mati[i]+kyaku[i]);
ans+=mati[i+1];
}
cout<<ans<<endl;
}
}