USACO 1 1 我的題解和程式

2022-09-02 22:54:28 字數 4475 閱讀 2222

usaco這個東西,有很多大牛已經「通關」了,還有的大牛有三天做了兩大章的事蹟,像我這樣的小菜,就慢慢從1.1往後來吧

1.1.1 ride

這個是第一題,純水,但是因為不知道usaco對輸出的回車符敏感,必須用writeln,所以交了好多次才ac,唯一注意的是關於乘的變數別忘了初始化成1

program ride;

varfin, fout: text;

a,b,i,t:longint;

s:string;

begin

assign(fin, 'ride.in'); reset(fin);

assign(fout, 'ride.out'); rewrite(fout);

a:=1;b:=1;

readln(fin,s);

for i:=1 to length(s) do

a:=(ord(s[i])-64)*a;

read(fin,s);

for i:=1 to length(s) do

b:=(ord(s[i])-64)*b;

if (a mod 47)=(b mod 47) then

writeln(fout,'go')

else

writeln(fout,'stay');

close(fout);

end.

1.1.2 gift1

純水,看清題義,讀入以後取模算一下就完了,一次ac

program gift1;

varmo,ng,np,i,j,k,f,b:integer;

t:string;

name:array[0..10] of string;

r,g:array[0..10] of integer;

begin

assign(input,'gift1.in');

assign(output,'gift1.out');

reset(input);

rewrite(output);

readln(np);

for i:=1 to np do

readln(name[i]);

for i:=1 to np do begin

readln(t);

for j:=1 to np do

if t=name[j] then

f:=j;

readln(mo,ng);

if ng<>0 then begin

g[f]:=mo-(mo mod ng);

b:=mo div ng;

end;

for j:=1 to ng do begin

readln(t);

for k:=1 to np do

if t=name[k] then

f:=k;

inc(r[f],b);

end;

end;

for i:=1 to np do

writeln(name[i],' ',r[i]-g[i]);

close(input);

close(output);

end.

1.1.3 friday

以時間線模擬就行了,說是不要提前做好資料,所以我盡量不用任何已知的變數,寫了個函式計算一天加上n天是星期幾。。。一次ac

program friday;

vara,i,j,k,n,f,tt:integer;

r:array[1..7] of integer;

function p(x,b:integer):integer;

var t:integer;

begin

t:=b mod 7;

p:=x+t;

if p>7 then

p:=p mod 7

end;

begin

assign(input,'friday.in');

assign(output,'friday.out');

reset(input);rewrite(output);

readln(n);

a:=1;

for i:=1900 to 1900+n-1 do begin

f:=0;

if (i mod 400)=0 then

f:=1

else

if ((i mod 100)<>0) and ((i mod 4)=0) then

f:=1;

for j:=1 to 12 do begin

tt:=p(a,12);

inc(r[tt]);

if (j=4) or (j=6) or (j=9) or (j=11) then

a:=p(a,30);

if (j=1) or (j=3) or (j=5) or (j=7) or (j=8) or (j=10) or (j=12) then

a:=p(a,31);

if j=2 then begin

if f=1 then

a:=p(a,29);

if f=0 then

a:=p(a,28);

end;

end;

end;

for i:=6 to 7 do

write(r[i],' ');

for i:=1 to 4 do

write(r[i],' ');

writeln(r[5]);

close(output);

end.

1.1.4 beads

這個題的題義翻譯的有點問題,但是基本上按他說的列舉就行了,沒有用題解說的複製串的方法,而是寫了乙個函式來求位置(既到端自動跳到另一端),注意資料範圍,不能用string存。特殊情況是顏色全同(記錄是否收集過),第乙個是萬能珠(題義其實是白色不算一種單獨的顏色,把它變成第乙個遇到的顏色),一次ac

program beads;

vars:array[0..350] of char;

t:array[0..350] of integer;

f,max,n,i,l,r,st,fl,c:integer;

fr:char;

function get(x,a:integer):integer;

begin

if a=1 then begin

get:=x+1;

if get>n then

get:=1;

end;

if a=0 then begin

get:=x-1;

if get<1 then

get:=n;

end;

end;

begin

assign(input,'beads.in');

assign(output,'beads.out');

reset(input);

rewrite(output);

readln(n);

for i:=1 to n do

read(s[i]);

for i:=1 to n do begin

r:=i;l:=i-1;f:=0;st:=0;c:=0;

fillchar(t,sizeof(t),0);

if i=1 then l:=n;

fr:=s[r];

while (t[r]=0) and (st=0) do begin

if s[r]='w' then begin

inc(c);t[r]:=1;r:=get(r,1);continue;

end;

if s[r]<>fr then begin

if fr='w' then begin

fr:=s[r];

inc(c);t[r]:=1;r:=get(r,1);

continue;

end;

st:=1;

continue;

end;

inc(c);t[r]:=1;r:=get(r,1);

end;

fr:=s[l];st:=0;

while (t[l]=0) and (st=0) do begin

if s[l]='w' then begin

inc(c);t[l]:=1;l:=get(l,0);continue;

end;

if s[l]<>fr then begin

if fr='w' then begin

fr:=s[l];

inc(c);t[l]:=1;l:=get(l,0);

continue;

end;

st:=1;

continue;

end;

inc(c);t[l]:=1;l:=get(l,0);

end;

if c>max then max:=c;

end;

writeln(max);

close(output);

end.

USACO 1 1貪婪的送禮者題解

又過了一道大水題。這道題目並不是特別難,如果用了map結構就很簡單了。但是有幾個地方比較坑。這樣他預先準備的錢不一定會送出。所以你懂得 還有乙個地方就是有可能這個人不送給別人錢,那麼這種情況就要continue掉,要不然求平均數時會因分母變0而報錯 最後我們來講一下map用法 首先我們要用map標頭...

USACO 1 1 破碎的項鍊

description 你有一條由n個紅色的,白色的,或藍色的珠子組成的項鍊 3 n 350 珠子是隨意安排的。這裡是 n 29 的二個例子 r 代表 紅色的珠子 b 代表 藍色的珠子 w 代表 白色的珠子 第一和第二個珠子在中已經被作記號。brbrrrbbbrrrrrbrrbbrbbbbrrrrb...

我理解的程式安裝和解除安裝過程

我的個人理解 其實桌面軟體就是檔案 登錄檔值。通過登錄檔的值索引到相應的檔案,然後載入檔案,實現程式執行。安裝的過程,就是把檔案copy到對應的目錄,然後寫登錄檔值 新增索引 解除安裝的過程,就是把登錄檔值設定為無效或刪掉,然後依次刪掉檔案系統的檔案。那麼,程式出錯,就是索引無法對應 比如找不到檔案...