每次写三个需要奇迹银桥的题,不满三个不发
也许有人能拿这些搞事?(模拟赛?)
我会粘题面的
T1「LOJ#4」Quine
内存限制:256 MiB 时间限制:1000 ms
标准输入输出 题目类型:传统
评测方式:Special Judge
题目描述
写一个程序,使其能输出自己的源代码。
代码中必须至少包含十个可见字符。
输入格式
输入文件为空。
输出格式
你的源代码。
题解
这个题,猛地一看,简单啊,cout
但是你仔细想想。
你要把源代码输出,莫非要递归? cout<<"cout<<"cout<<...."" 这显然是不行的。
所以要想办法打断递归。
窟思冥想。
可以用 printf ,有 "%s" 可以用,就是我们可以保证一个%s就可以输出一层了,然后就停下了。
信心满满的去码了。
然后,发现第二个问题:
在C++中,一个"\n"代表换行,一个"\""代表双引号,而只有"\\"才代表一个反斜杠。
(一个\要用\\输出,用\\又有用\\\\输出……)
又炸了。
再次去规避这些问题。
打一个表出来:
" | 34 |
'\n' | 10 |
好了,我们应该可以切了这个题了。
用%c输出10,34来换行,加引号。
但还是要避免换行,减少码长。
#include<cstdio>
int main(){char s[]="#include<cstdio>%cint main(){char s[]=%c%s%c;printf(s,10,34,s,34);}";printf(s,10,34,s,34);}
T2 排座椅
题目描述
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之
后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的
通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果
一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入格式
输入文件seat.in的第一行,有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。
接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出格式
输出文件seat.out共两行。
第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。
样例
样例输入
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
样例输出
2
2 4
题解
这个题很简单,只是说一个其基因桥,用小数点存一些相关信息
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
float tcl[2001]={0};
float tch[2001]={0};
void pour(float a[],int b){
for(int i=1;i<=b;i++){
cout<<a[i]<<" ";
}
cout<<"\n";
}
int main(){
int h,l,cuh,cul,cdn;
int ch1,cl1,ch2,cl2;
cin>>l>>h>>cuh>>cul>>cdn;
for(int i=1;i<=cdn;i++){
cin>>cl1>>ch1>>cl2>>ch2;
if(ch1==ch2){
tch[cl1<=cl2?cl1:cl2]++;
// pour(tcl,l);
}
if(cl1==cl2){
tcl[ch1<=ch2?ch1:ch2]++;
// pour(tch,h);
}
}
for(int i=1;i<=l;i++){
if(tcl[i]!=0) tcl[i]+=(float)i/10000;
else tcl[i]=0;
// pour(tcl,l);
// cout<<" l"<<tcl[i]<<endl;
}
for(int j=1;j<=h;j++)
{
if(tch[j]!=0) tch[j]+=(float)j/10000;
else tch[j]=0;
// pour(tch,h);
}
sort(tcl+1,tcl+l+1,greater<float>());
// pour(tcl,l);
sort(tch+1,tch+h+1,greater<float>());
// pour(tch,h);
int r;
for(int i=1;i<=h;i++){
if(tch[i]<=0){
tch[i]=1001.1;
continue;
}
r=(int)tch[i];
tch[i]=(tch[i]-r)*10000;
}
for(int i=1;i<=l;i++){
if(tcl[i]<=0){
tcl[i]=1001.1;
continue;
}
r=(int)tcl[i];
tcl[i]=(tcl[i]-r)*10000;
}
sort(tcl+0,tcl+cul+1,less<float>());
sort(tch+0,tch+cuh+1,less<float>());
// pour(tch,h);pour(tcl,l);
for(int i=1;i<=cuh;i++){
//cout<<"r"<<r<<endl;
/* if(r<1000)*/printf("%.0f",tch[i]);
//cout<<"l"<<tcl[i]<<endl;
if(i==cuh){
printf("\n");
break;
}
else printf(" ");
}
for(int i=1;i<=cul;i++){
//cout<<"r"<<r<<endl;
/* if(r<1000)*/printf("%.0f",tcl[i]);
// cout<<(tch[i]-r)*1000;
if(i==cul){
printf("\n");
break;
}
else printf(" ");
}
getchar();
return 0;
}
T3 [LOJ#3]Copycat
题目描述
这道题用于测试文件输入输出,请注意使用文件输入输出,而非标准输入输出。
输入一个正整数$a$,输出这个数$a$
输入格式
接下来$T$行,每行一个正整数$a$.
输出格式
样例
样例输入 1
3
1
2
3
样例输出 1
1
2
3
样例输入 2
1
1000000000000000000000000000000000
样例输出 2
1000000000000000000000000000000000
题解
这不是题解,是比较一下各种文件输入输出的速度哒!
最上面是:fopen
#include <cstdio>
char st[99999];
int main() {
FILE *fin, *fout;
fin = fopen("copycat.in", "rb");
fout = fopen("copycat.out", "wb");
int num;
fscanf(fin, "%d", &num);
for (int i = 1; i <= num; i++) {
fscanf(fin, "%s", st);
fprintf(fout, "%s\n", st);
}
fclose(fin), fclose(fout);
return 0;
}
中间是:fstream(我喜欢流输入输出)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
using namespace std;
int T;
string a;
int main() {
fstream fin, fout;
fin.open("copycat.in", ios_base::in);
fout.open("copycat.out", ios_base::out);
fin >> T;
while (T--) {
fin >> a;
fout << a << endl;
}
fin.close();
fout.close();
return 0;
}
最下面是:freopen(简单)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <string>
using namespace std;
int T;
string a;
int main() {
freopen("copycat.in", "r", stdin);
freopen("copycat.out", "w", stdout);
cin >> T;
while (T--) {
cin >> a;
cout << a << endl;
}
fclose(stdin), fclose(stdout);
return 0;
}
终于水完了
这是第一弹的全部内容!