1001:题意就是给2个字符串,输出_后面的内容再加上_small_,水题。
#include<cstdio>
char s[50],s2[50],s3[50],s4[40];
int main(){
while(scanf("%[^_]_%s%[^_]_%s",s3,s,s4,s2) == 4){
printf("%s_small_%s\n", s, s2);
}
return 0;
}
1002:该死的字符串,错了10086次。就是模拟模拟。发现自己对这种细节超多的题目特别蛋疼。
#include<cstdio>
char s1[50],s2[50],s3[50],s4[40];
char name[][20] = {"","ADD","SUB","DIV","MUL","MOVE","SET"};
void print(int x, int t){
if(t == 0){
return;
}
print(x/2, t-1);
printf("%d", x%2);
}
void print(int x){
print(x,5);
}
int get(char *s,int n){
int d = 0;
for(int i = 0; i < n; i++){
d = d * 2 + s[i] - '0';
}
return d;
}
bool check(char *s){
int i = 0;
while(s[i]){
if(s[i]!='0' && s[i]!='1')return false;
i++;
}
return i==16;
}
int main(){
int n;
while(scanf("%d", &n) == 1){
if(n == 1){
scanf("%s%s",s1,s2);
int x;
if(s1[0] == 'A') print(1,6);
else if(s1[0] == 'S' && s1[1] == 'U' ) print(2,6);
else if(s1[0] == 'D') print(3,6);
else if(s1[1] == 'U') print(4,6);
else if(s1[1] == 'O') print(5,6);
else print(6,6);
int d = 0;
for(x = 1; s2[x]!=','&&s2[x];x++){
d = d * 10 + s2[x] - '0';
}
print(d);
d = 0;
if(s2[x]){
for(x+=2; s2[x]; x++){
d = d * 10 + s2[x] - '0';
}
}
print(d);
printf("\n");
}else{
scanf("%s",s1);
if(!check(s1)){printf("Error!\n");continue;}
int n1 = get(s1,6), n2 = get(s1+6,5), n3 = get(s1+11, 5);
if(n1==0||n1>6||n2==0||(n3==0&&n1!=6||n3!=0&&n1==6)) printf("Error!\n");
else{
printf("%s ", name[n1]);
printf("R%d", n2);
if(n3) printf(",R%d", n3);
printf("\n");
}
}
}
return 0;
}
1003:比赛的时候因为1002错了太多,时间不够没做出来,赛后A出来内牛满面无数草泥马向1002奔腾而去。
就是给一个矩阵,然后做一个自乘,然后给100000个r,c 求r行c列的元素和。因为矩阵是1000的,所以o(n^3)的乘法不行,但是他给的矩阵元素是有规律的,所以可以优化。推导后发现,P[i][j] = P[i-1][j-1] - M[i-1][n-1] * M[n-1][j-1] + M[i][0] * M[0][j];(M为原矩阵,P = M * M),最后还有个trick就是最后的结果要用long long 存。
#include<cstdio>
int a[2005];
int n;
int P[1005][1005];
int M[1005][1005];
int main(){
while(scanf("%d", &n)==1){
for(int i = 0; i <= 2*n-2; i++)
scanf("%d", &a[i]);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
M[i][j] = a[n-1-i+j];
}
}
for(int i = 0; i < n; i++){
P[i][0] = P[0][i] = 0;
for(int k = 0; k < n; k++){
P[i][0] += M[i][k] * M[k][0];
if(i != 0) P[0][i] += M[0][k] * M[k][i];
}
}
for(int i = 1; i < n; i++){
for(int j = 1; j < n; j++){
P[i][j] = P[i-1][j-1] - M[i-1][n-1] * M[n-1][j-1] + M[i][0] * M[0][j];
}
}
int m;scanf("%d", &m);
int r,c;
long long sum=0;
int ans = 0;
while(m--){
scanf("%d%d", &r, &c);
sum += (ans = P[(ans+r)%n][(ans+c)%n]);
}
printf("%I64d\n", sum);
}
return 0;
}