「AOJ1110~1120」の編集履歴(バックアップ)一覧はこちら
AOJ1110~1120 - (2013/01/16 (水) 20:28:57) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*1111 Cyber Guardian
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1111
パケットフィルタリングの実装をこれ以上できないほど簡素にした問題。
n個のパケットルールとm個の通信許可の質問が与えられる。
パケットルールはpermit(通信OK)なアドレスと通信拒否すべきアドレス(deny)でFromからToへ送信される場合をOKか拒否をあらわす。
後から提示されたルールほど優先順位が高いとして、パケットルールで通信Okなアドレスなら通信可としてそれを表示。
通信不可能なアドレスであることが判明したらそれは表示しない。
どのルールにも引っかからないアドレスは通信拒否とせよ。
通信可の通信データの数を表示しそのあと通信内容を到着順に表示せよ。
解法
この問題英語の読解がどうしてもできず他人のコードを少しだけ読んでしまいました。
題意さえつかめれば後は簡単ですが自力で解けなかったのは少し悔しいところです。
#include<stdio.h>
#include<string>
#include<vector>
#include<iostream>
bool isOk(std::string str1,std::string str2){
for(int i=0;i<str2.size();i++){
if(str2[i]!='?'&&str1[i]!=str2[i]){
return false;
}
}
return true;
}
void check(int n,int m){
std::string str1,str2,str3;
std::vector<std::string> To,From,Type,ansMes;
for(int i=0;i<n;i++){
std::cin>>str1>>str2>>str3;
Type.push_back(str1);
From.push_back(str2);
To.push_back(str3);
}
for(int i=0;i<m;i++){
std::cin>>str1>>str2>>str3;
for(int j=Type.size()-1;j>=0;j--){
if(isOk(str1,From[j])==true&&isOk(str2,To[j])==true){
if(Type[j]=="permit"){
ansMes.push_back(str1+" "+str2+" "+str3);
}
break;
}
}
}
std::cout<<ansMes.size()<<"\n";
for(int i=0;i<ansMes.size();i++){
std::cout<<ansMes[i]<<"\n";
}
}
int main(){
int n,m;
while(1){
scanf("%d %d",&n,&m);
if(n==0&&m==0)break;
check(n,m);
}
}
*1119 Exploring Caves
縦か横のみに移動するロボの移動データから、最も原点からロボが離れた時かつx座標が最も大きくなる点を求めよという問題。
中学生でも解ける問題から大学生でも悩む問題まで幅広くそろっているのが会津大学オンラインジャッジの特徴。
今日はこの通り中学生でも解ける問題を見つけたのでこまめに正答数を稼ぐ。
リニアに読み込むだけでいいので楽だ。
#include<stdio.h>
void setData(){
int x=0,y=0,dx,dy,len,ans=0,ansX=0,ansY=0;
while(1){
scanf("%d %d",&dx,&dy);
if(dx==0&&dy==0)break;
x+=dx;
y+=dy;
len=x*x+y*y;
if(len>ans|| (len==ans&&x>ansX)){
ansX=x;
ansY=y;
ans=len;
}
}
printf("%d %d\n",ansX,ansY);
}
int main(){
int n;
scanf("%d",&n);
while(n--)setData();
}
*1111 Cyber Guardian
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1111
パケットフィルタリングの実装をこれ以上できないほど簡素にした問題。
n個のパケットルールとm個の通信許可の質問が与えられる。
パケットルールはpermit(通信OK)なアドレスと通信拒否すべきアドレス(deny)でFromからToへ送信される場合をOKか拒否をあらわす。
後から提示されたルールほど優先順位が高いとして検査し、パケットルールで通信Okなアドレスト判明したら通信可としてそれを表示。
通信不可能なアドレスであることが判明したらそれは表示しない。
どのルールにも引っかからないアドレスは通信拒否とせよ。
通信可の通信データの数を表示しそのあと通信内容を到着順に表示せよ。
解法
この問題英語の読解がどうしてもできず他人のコードを少しだけ読んでしまいました。
題意さえつかめれば後は簡単ですが自力で解けなかったのは少し悔しいところです。
#include<stdio.h>
#include<string>
#include<vector>
#include<iostream>
bool isOk(std::string str1,std::string str2){
for(int i=0;i<str2.size();i++){
if(str2[i]!='?'&&str1[i]!=str2[i]){
return false;
}
}
return true;
}
void check(int n,int m){
std::string str1,str2,str3;
std::vector<std::string> To,From,Type,ansMes;
for(int i=0;i<n;i++){
std::cin>>str1>>str2>>str3;
Type.push_back(str1);
From.push_back(str2);
To.push_back(str3);
}
for(int i=0;i<m;i++){
std::cin>>str1>>str2>>str3;
for(int j=Type.size()-1;j>=0;j--){
if(isOk(str1,From[j])==true&&isOk(str2,To[j])==true){
if(Type[j]=="permit"){
ansMes.push_back(str1+" "+str2+" "+str3);
}
break;
}
}
}
std::cout<<ansMes.size()<<"\n";
for(int i=0;i<ansMes.size();i++){
std::cout<<ansMes[i]<<"\n";
}
}
int main(){
int n,m;
while(1){
scanf("%d %d",&n,&m);
if(n==0&&m==0)break;
check(n,m);
}
}
*1119 Exploring Caves
縦か横のみに移動するロボの移動データから、最も原点からロボが離れた時かつx座標が最も大きくなる点を求めよという問題。
中学生でも解ける問題から大学生でも悩む問題まで幅広くそろっているのが会津大学オンラインジャッジの特徴。
今日はこの通り中学生でも解ける問題を見つけたのでこまめに正答数を稼ぐ。
リニアに読み込むだけでいいので楽だ。
#include<stdio.h>
void setData(){
int x=0,y=0,dx,dy,len,ans=0,ansX=0,ansY=0;
while(1){
scanf("%d %d",&dx,&dy);
if(dx==0&&dy==0)break;
x+=dx;
y+=dy;
len=x*x+y*y;
if(len>ans|| (len==ans&&x>ansX)){
ansX=x;
ansY=y;
ans=len;
}
}
printf("%d %d\n",ansX,ansY);
}
int main(){
int n;
scanf("%d",&n);
while(n--)setData();
}